2013-12-17 9 views
6

Sehr einfach zu replizieren, ist die Ausgabe bizarr;Überschreiben der Standardparameter in C#

Erwartete Ausgabe ist "bbb bbb" tatsächliche Ausgabe ist "aaa bbb"

Hat jemand bekam jede MSDN Erklärung für dieses Verhalten? Ich konnte keine finden.

((a)new b()).test(); 
new b().test(); 


public class a 
{ 
    public virtual void test(string bob = "aaa ") 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class b : a 
{ 
    public override void test(string bob = "bbb ") 
    { 
     HttpContext.Current.Response.Write(bob); 
    } 
} 
+0

Gibt ((a) (neu b())) .test() die gewünschten Ergebnisse? – rhughes

+4

Erwartete Ausgabe nach * wer *? – Jamiec

+0

Ich glaube, dass es ungültig ist, den Standardwert eines optionalen Parameters während des Überschreibens einer Methode zu ändern. Ändert das nicht die Methodensignatur? –

Antwort

12

Warum erwarten Sie "BBB BBB"?

Da die Instanz a werfen, die einzige Information an den Compiler auf dem ersten Aufruf ist die Version mit "aaa", so dieser Wert ist, was verwendet wird.

In der zweiten Version ohne die Besetzung, der Compiler kann die "bbb" sehen, also dieser Wert ist, was verwendet wird.

Polymorphismus Auswirkungen auf die Methode aufgerufen - aber es hat keinen Einfluss auf die Parameter übergeben. Im Wesentlichen werden die Standardwerte vom Compiler geliefert (im Call-site), so dass Ihr Code ist tatsächlich äquivalent zu:

((a)new b()).test("aaa"); 
new b().test("bbb"); 

wo die "aaa" und "bbb"bei der Kompilierung, durch Inspektion zugeführt werden der aufgelösten Methode.

+3

Also, um es noch einmal zu betonen, Standardwerte werden zur Kompilierzeit implementiert, nicht zur Laufzeit? –

+1

@BolucPapuccuoglu ja; Ich habe bereits etwas mehr hinzugefügt, um das hervorzuheben –