(Fehlerhafte?) Reaktion der IDE auf fehlende Verweise für Typen von MustOverride-Membern beim Erben

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    (Fehlerhafte?) Reaktion der IDE auf fehlende Verweise für Typen von MustOverride-Membern beim Erben

    Das Problem ist so speziell, dass mir dafür einfach nicht die richtigen Stichworte einfallen, die bei einer Google-Suche passende Ergebnisse liefern könnten. Probiert habe ich es, aber es ist nur allgemeines zu Vererbung heraus gekommen.

    Mir ist ein möglicher Bug in der Visual Basic 2010 Express - IDE aufgefallen:

    Die Ausgangssituation ist so:

    Es gibt eine Projektmappe mit einer Klassenbibliothek:
    Nennen wir sie für den Test BaseClassLibrary.
    Darin gibt es nur eine einzige Klasse:

    VB.NET-Quellcode

    1. Public MustInherit Class BaseClass
    2. Public MustOverride ReadOnly Property Foo As Color
    3. End Class

    Wichtig ist dabei, dass ein Verweis auf System.Drawing.dll eingefügt wird, da ansonsten der Color-Typ nicht erkannt wird.

    Als nächstes erstellt man eine neue Projektmappe mit einer Klassenbibliothek "InheritedClassLibrary". (Nicht ein neues Projekt in der selben Projektmappe!)
    Es wird ein Verweis auf die Klassenbibliothek BaseClassLibrary.dll hinzugefügt. Wichtig ist dabei, dass der eigentlich nötige Verweis auf System.Drawing.dll nicht eingefügt wird.
    Wieder die einzige Klasse darin:

    VB.NET-Quellcode

    1. Public Class InheritedClass
    2. Inherits BaseClassLibrary.BaseClass
    3. End Class

    Das war's schon. Und wenn man genau hinsieht, erkennt man, dass das nicht kompiliert werden kann, da die InheritedClass-Klasse die MustOverride-Property Foo nicht überschreibt.
    Aber hier scheint der Bug versteckt zu sein. Durch den fehlenden Color-Typ scheint die IDE durcheinander zu kommen. Fügt man den Verweis auf System.Drawing.dll hinzu, wird der Fehler sofort angezeigt:

    Die InheritedClass-Klasse muss als MustInherit deklariert werden oder folgende geerbte MustOverride-Member überschreiben:
    BaseClassLibrary.BaseClass : Public MustOverride ReadOnly Property Foo As System.Drawing.Color.

    Entfernt man den Verweis, verschwindet auch der Fehler wieder.

    Interessant ist auch, dass die zu überschreibende Property nicht in Intellisense angezeigt wird:


    Erstellt man jetzt eine neue Projektmappe mit einer Windows-Forms-Anwendung und fügt man einen Verweis auf BaseClassLibrary.dll und InheritedClassLibrary.dll hinzu, kann man das Ganze etwas weiter ausreizen:

    VB.NET-Quellcode

    1. Private Sub HelperMethod() Handles Button1.Click
    2. TestClasses()
    3. End Sub
    4. Private Sub TestClasses()
    5. Dim BaseInstance As BaseClassLibrary.BaseClass = Nothing
    6. Dim BaseFoo = BaseInstance.Foo 'Würde natürlich in einer NullReferenceException enden, ist aber
    7. Dim InheritedInstance As New InheritedClassLibrary.InheritedClass
    8. Dim InheritedFoo = InheritedInstance.Foo
    9. End Sub

    Kompiliert einwandfrei.
    Interessant wird es, wenn man einen Haltepunkt auf Zeile 2 setzt. Startet man das Debugging und klickt man den Button, hält der Debugger ganz normal an. Will man nun einen Einzelschritt in die Methode TestClasses() machen, tritt eine Exception auf, die ich vorher noch nie gesehen habe:

    Also ich hätte da eher erwartet, dass eine defekte Assembly erstellt wird, aber dass eine funktionsfähige Assembly erstellt wird, der einfach eine Implementierung fehlt, hätte ich wirklich nicht erwartet.


    Ich habe im Titel "(Fehlerhafte?)" geschrieben. Ich bin der Meinung, dass die IDE das auch, wenn der Typ der Property nicht gefunden werden kann, erkennen müsste. Es kann aber auch sein, dass ich da falsch liege.

    Weitere Szenarien mit z.B. mehreren Vererbungsstufen habe ich jetzt nicht getestet. Interessant wäre auch, ob die Visual C# 2010 Express - IDE das selbe Problem hat... und ob das bei Professional- bzw. Ultimate- Versionen auch auftritt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ich habe das mal nachgestellt. Das Problem tritt auch in VS 2010 Ultimate in VB auf. Eine längere Suche im Netz ergab das hier: computer-programming-forum.com…tnet/2bd8f7da0a4170f4.htm

    Scheinbar hat es einen solchen Compiler-Bug (in Managed-C++) schonmal gegeben, nur in abgeschwächter Form. Jetzt tritt das Problem offenbar nur noch auf, wenn eine zusätzliche, aber fehlende Typreferenz mit im Spiel ist. Du hast übrigens Recht: Die Suche danach ist relativ aufwändig. Ich habe hiermit aufgehört: vb compiler does not complain about missing implementation with additional references typeloadexception. Das wäre auch eine tolle Überschrift für einen Bugreport auf Microsoft Connect. Der erste Suchtreffer behandelt in etwa dasselbe Problem in C#, sodass ich davon ausgehe, dass das Problem auch dort existiert.

    Danke jedenfalls für deinen Post - auch wenn mir das Problem noch nie begegnet ist, weiß ich zumindest schonmal, wo im Fall der Fälle der Fehler liegt.
    Gruß
    hal2000
    Scheint in VS2012 Express auch aufzutreten.

    Stellt man Dein Beispiel nach, so bemängelt der Compiler das Fehlende Override auch erst beim Hinzufügen des Verweises.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o