2013-05-01 8 views
12

Ich frage mich, was der Grund für den Aufruf der Methode ist, die "double in derived" ausgibt. Ich habe in der C# -Spezifikation keinen Hinweis darauf gefunden.C# Überladene Methode Aufruf mit Vererbung

public class A 
{ 
    public virtual void Print(int x) 
    { 
     Console.WriteLine("int in base"); 
    } 
} 

public class B : A 
{ 
    public override void Print(int x) 
    { 
     Console.WriteLine("int in derived"); 
    } 
    public void Print(double x) 
    { 
     Console.WriteLine("double in derived"); 
    } 
} 



B bb = new B(); 
bb.Print(2); 
+0

http://msdn.microsoft.com/en-us/library/aa691338%28v=vs.71%29.aspx – spender

+0

Ich kann Sie die Regeln von 7.4.2.2 und 7.4.2.3 entschlüsseln, Sie sind wahrscheinlich Klüger als ich, aber es wird irgendwo da sein. – spender

+0

@spender, Es könnte drin sein, aber es ist schlecht geschrieben :). – Silvermind

Antwort

6

Gerade vom C# spec (7.5.3 Überlast Auflösung):

die Menge des Kandidaten für einen Methodenaufruf nicht Einschließen von Methoden, die als überschreiben markiert sind (§7.4) und Methoden in einer Basisklasse sind keine Kandidaten, wenn eine Methode in einer abgeleiteten Klasse anwendbar ist (§7.6.5.1).

In Ihrem Beispiel die außer Kraft gesetztPrint(int x) keinen Kandidaten und Print(double x) anwendbar ist, so dass es ohne die Notwendigkeit zu prüfen, die Methoden in der Basisklasse gerichtet.

0

Der Compiler an Methoden sieht die in der am meisten abgeleiteten Klasse frisch erklärt (auf der Grundlage der Kompilierung-Typ des Ausdrucks) und sieht wenn überhaupt anwendbar sind. Wenn sie es sind, verwendet es das "beste" verfügbare.

Siehe die Antwort auf diese Frage:

Different behaviour of method overloading in C#

+2

Bitte zitieren Sie und fügen Sie einen Link zur ursprünglichen Antwort hinzu. Vielen Dank. –

+0

Ein Link zu der obigen Antwort hinzugefügt, aus der das Zitat stammt – cvraman