Problem mit generischen Klassen EDIT: hat sich erledigt, der Fehler lag ganz woanders ....

  • VB.NET
  • .NET (FX) 4.0

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    Problem mit generischen Klassen EDIT: hat sich erledigt, der Fehler lag ganz woanders ....

    Hallo,

    ich habe hier eine abstrakte Basisklasse:

    VB.NET-Quellcode

    1. Public MustInherit Class ChannelData(Of T)
    2. Protected Data As New List(Of Byte)
    3. Protected Property _rwChan As T


    Und dann eine Klasse, die davon erbt:

    VB.NET-Quellcode

    1. Public Class ReceiveChannelData
    2. Inherits ChannelData(Of ReceiveChannelRow)


    Wenn ich die Anwendung aber laufen lasse und im Laufe der Zeit auf _rwChan zugreifen will, sehe ich im Überwachungsfenster folgende Meldung:

    + _rwChan {"Der generische Typ "Modbus.Data.ChannelData`1" wurde mit der falschen Anzahl von generischen Argumenten in Assembly "Modbus, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" verwendet.":"Modbus.Data.ChannelData`1"} System.TypeLoadException



    Was passt denn nicht?

    Ich habe schon alle Zusätze (hatte zuerst 2 Typen und eine Typbeschränkung mit "As DataRow" drin) entfernt, um auf den Kern zu kommen, das Problem tritt jetzt durch diese nackte Architektur auf ;(
    MustInherit habe ich jetzt probeweise auch weggenommen, geht immer noch nicht.



    EDIT: hat sich erledigt, jetzt geht alles. Ich habe in einem der Konstruktoren einfach vergessen _rwChan auf Objekt zu setzen :whistling:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sonne75“ ()

    Nein, nichts.

    Diese Exception kommt beim ersten Zugriff, da steht nur ganz typisches, wenn was Nothing ist.
    Ich habe im Konstruktor einen Haltepunkt gemacht und schau, was _rwChan für einen Wert hat, und da kommt diese Beschreibung anstatt vom Typ, im Überwachungsfenster.
    Was hast Du wie instanziiert?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Dim xx As New ReceiveChannelData
    4. End Sub ' hier ein Galtepunkt
    5. End Class
    6. Public Class ReceiveChannelRow
    7. End Class
    8. Public Class ReceiveChannelData
    9. Inherits ChannelData(Of ReceiveChannelRow)
    10. End Class
    11. Public MustInherit Class ChannelData(Of T)
    12. Protected Data As New List(Of Byte)
    13. Protected Property _rwChan As T
    14. End Class

    Bilder
    • inherit.png

      25,61 kB, 724×386, 68 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Problem tritt nicht beim Objekt der Klasse, sondern wenn ich auf _rwChan zugreifen will.

    Wenn ich dann hier einen Haltepunkt mache:

    VB.NET-Quellcode

    1. Public Class ReceiveChannelData
    2. Inherits ChannelData(Of ReceiveChannelRow)
    3. Public Sub New(ByVal rwChan As ReceiveChannelRow)
    4. _rwChan = rwChan
    5. End Sub 'z.B. Hier Haltepunkt

    und im Überwachungsfenster nachschaue, sehe ich dann das, was oben steht.
    Eben nicht, ich bekomme ja eine Exception, weil ich auf _rwChan.EineProperty nicht zugreifen kann.

    sonne75 schrieb:

    Diese Exception kommt beim ersten Zugriff, da steht nur ganz typisches, wenn was Nothing ist.


    @Artentus
    EDIT: Ich nehme alles zurück, die Exception tritt in DIESER Konstellation nicht auf. Sondern in einer, wo ich verschachtelte Ts hatte, ich schreibe gleich auf.

    VB.NET-Quellcode

    1. Public MustInherit Class ChannelData(Of T As DataRow, T1 As BaseRegister(Of T))


    Kann man es überhaupt so machen? Weil meine andere abstrakte Basisklasse braucht halt diesen T.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „sonne75“ ()

    sonne75 schrieb:

    nicht zugreifen kann
    Bei mir läuft dieser Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Dim rcr = New ReceiveChannelRow
    4. Dim xx As New ReceiveChannelData(rcr)
    5. End Sub
    6. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    7. Dim txt = "8 + 9 -10 + 5"
    8. Dim index = 0
    9. Dim indexStart = 0
    10. Do While index >= 0
    11. index = txt.IndexOfAny(New Char() {"+"c, "-"c, "*"c, "/"c}, indexStart)
    12. indexStart = index + 1
    13. Debug.WriteLine(index.ToString)
    14. Loop
    15. End Sub
    16. End Class
    17. Public Class ReceiveChannelRow
    18. Public Overrides Function ToString() As String
    19. Return "ReceiveChannelRow"
    20. End Function
    21. End Class
    22. Public Class ReceiveChannelData
    23. Inherits ChannelData(Of ReceiveChannelRow)
    24. Public Sub New(ByVal rwChan As ReceiveChannelRow)
    25. _rwChan = rwChan
    26. End Sub 'z.B. Hier Haltepunkt
    27. End Class
    28. Public MustInherit Class ChannelData(Of T)
    29. Protected Data As New List(Of Byte)
    30. Protected Property _rwChan As T
    31. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja, sorry, habe den Fehler schon gefunden... :whistling:

    Habe in einem der Konstruktoren vergessen, _rwChan auf Objekt zu setzen. Im Laufe der Codeanpassung (habe schnell die Generik rausgeschmissen, um funktionierendes Programm zu geben) habe ich es gemerkt, aber nichts weiter dabei gedacht, weil ich mich so auf die Fehlerbeschreibung im Überwachungsfenster fixiert habe, und es ja danach immer noch existierte...

    Aber immerhin scheint die Verwendung der Übergabeparameter direkt in der Signatur zu funktionieren, cool! :thumbup:

    VB.NET-Quellcode

    1. Public MustInherit Class ChannelData(Of T As DataRow, T1 As BaseRegister(Of T))