2013-12-17 32 views
6

Naprawdę proste do powielenia, wyjście jest dziwne;Zastępowanie domyślnych parametrów w C#

Oczekiwany wynik jest "bbb bbb" rzeczywistej produkcji jest "aaa bbb"

Czy ktoś ma jakieś MSDN wyjaśnienie tego zachowania? Nie mogłem znaleźć żadnego.

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

Czy ((a) (nowy b())). Test() daje oczekiwane rezultaty? – rhughes

+4

Oczekiwany wynik zgodnie z * kto *? – Jamiec

+0

Uważam, że nie można zmienić domyślnej wartości parametru opcjonalnego podczas przesłonięcia metody. Czy to nie zmienia sygnatury metody? –

Odpowiedz

12

Dlaczego oczekujesz "bbb bbb"?

Ponieważ jesteś odlewania instancji do a, jedyna informacja dla kompilatora na pierwsze wezwanie jest wersja z "aaa", więc że wartość jest co służy.

W drugiej wersji bez rzutowania kompilator może zobaczyć wartość "bbb", więc ta wartość jest używana jako.

Oddziaływanie polimorfizmu, która to metoda jest wywołana - ale nie ma wpływu na parametry przekazane. Zasadniczo, wartości domyślne są dostarczane przez kompilator (w call-miejscu), więc kod jest rzeczywiście równoważne:

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

gdzie dostarczył "aaa" i "bbb"w czasie kompilacji, przez inspekcję rozwiązanej metody.

+3

Aby ponownie podkreślić, wartości domyślne są implementowane w czasie kompilacji, a nie w czasie wykonywania? –

+1

@BolucPapuccuoglu yes; Dodałem już nieco więcej, aby to podkreślić –