2013-12-17 20 views
6

Realmente semplice da replicare, l'output è bizzarro;Sovrascrittura dei parametri di default in C#

risultato atteso è "bbb bbb" uscita effettiva è "aaa bbb"

Chiunque ha ottenuto delle spiegazioni MSDN di questo comportamento? Non sono riuscito a trovarne.

((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

Does ((a) (new b())). Test() fornisce i risultati desiderati? – rhughes

+4

Uscita prevista in base a * who *? – Jamiec

+0

Credo che non sia valido modificare il valore predefinito di un parametro facoltativo mentre si ignora un metodo. Non cambia la firma del metodo? –

risposta

12

Perché ti aspetti "bbb bbb"?

Dal momento che si sta casting l'istanza al a, le uniche informazioni al compilatore alla prima chiamata è la versione con "aaa", in modo che il valore è quello che viene utilizzato.

Nella seconda versione senza il cast, il compilatore può vedere il "bbb", quindi quel valore è ciò che viene utilizzato.

Impatti del polymorphism quale metodo è invocato - ma non ha alcun impatto sui parametri passati. In sostanza, i valori di default vengono forniti dal compilatore (presso il call-site), in modo che il codice è in realtà equivale a:

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

dove il "aaa" e "bbb" viene fornito al momento della compilazione, mediante ispezione del metodo risolto.

+3

Quindi, per sottolineare nuovamente, i valori predefiniti sono implementati in fase di compilazione, non di runtime? –

+1

@BolucPapuccuoglu sì; Ho già aggiunto un po 'di più per evidenziarlo –

Problemi correlati