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:
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:
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:
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:
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.
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:
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:
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
- Private Sub HelperMethod() Handles Button1.Click
- TestClasses()
- End Sub
- Private Sub TestClasses()
- Dim BaseInstance As BaseClassLibrary.BaseClass = Nothing
- Dim BaseFoo = BaseInstance.Foo 'Würde natürlich in einer NullReferenceException enden, ist aber
- Dim InheritedInstance As New InheritedClassLibrary.InheritedClass
- Dim InheritedFoo = InheritedInstance.Foo
- 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
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils