Dies ist eigentlich eine Trickfrage.
Die Antwort ist mehrdeutig, was "sollte" passieren. Sicher, der C#-Compiler nimmt es aus dem Bereich der Mehrdeutigkeit in das Konkrete; jedoch, da diese Methoden sich gegenseitig überladen und weder überschrieben noch verdeckt sind, ist es vernünftig anzunehmen, dass hier der "beste Argumentumfang" gelten sollte und daher zu dem Schluss kommen, dass A::Foo(int n) aufgerufen werden sollte, wenn eine Ganzzahl als Argument übergeben wird.
Um zu beweisen, dass es unklar ist, was "sollte" passieren, führt genau derselbe Code, wenn er in VB.NET ausgeführt wird, zu entgegengesetzten Ergebnissen:
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Dim b As New B
b.Foo(5) ' A::Foo
b.Foo(5.0) ' B::Foo
End Sub
End Class
Class A
Sub Foo(ByVal n As Integer)
MessageBox.Show("A::Foo")
End Sub
End Class
Class B
Inherits A
Overloads Sub Foo(ByVal n As Double)
MessageBox.Show("B::Foo")
End Sub
End Class
Ich bin mir bewusst, dass ich C#-Programmierern die Möglichkeit gebe, über VB.NET herzuziehen, weil es sich nicht an C# hält. Aber meiner Meinung nach könnte man sehr überzeugende Gründe dafür anführen, dass es VB.NET ist, das hier die richtige Interpretation trifft.
Weiterhin suggeriert IntelliSense in der C#-IDE, dass es zwei Überladungen für die Klasse B gibt (weil es sie gibt, oder zumindest geben sollte!), aber die Version B.Foo(int n) kann tatsächlich nicht aufgerufen werden (nicht ohne vorher explizit in eine Klasse A zu casten). Das Ergebnis ist, dass die C#-IDE tatsächlich nicht mit dem C#-Compiler synchron ist.
Eine andere Möglichkeit, dies zu betrachten, ist, dass der C#-Compiler eine beabsichtigte Überladung in eine verdeckte Methode umwandelt. (Das scheint mir nicht die richtige Wahl zu sein, aber das ist offensichtlich nur meine Meinung.)
Als Interviewfrage denke ich, dass es in Ordnung sein kann, wenn man interessiert ist, eine Diskussion über die hier aufgezeigten Probleme zu führen. Was das "richtig" oder "falsch" angeht, so finde ich, dass die Frage an eine Trickfrage grenzt, die leicht übersehen oder sogar aus den falschen Gründen richtig beantwortet werden könnte. Tatsächlich ist die Antwort auf die Frage, was "sollte", sehr umstritten.
35 Stimmen
Wenn mich jemand fragt, werde ich sagen, du hättest die Main-Methode in einer Klasse schreiben sollen :))
0 Stimmen
Kann mir jemand erklären, warum die Basisklassenmethode aufgerufen wird, wenn wir den Parameter vom Typ int auf double (A.Foo) und von double auf int (B.Foo) ändern und den Input als double übergeben?