2013-12-17 2 views
6

非常に簡単に複製すると、出力は奇妙です。C#のデフォルトパラメータをオーバーライド

の予想される出力は

は誰を持って「BBB BBB」 実際の出力である「AAA BBB」であるこの動作のいずれかのMSDNの説明を得ましたか。私は何も見つけることができませんでした。

((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()あなたが望む結果を与えるか? – rhughes

+4

* who *? – Jamiec

+0

メソッドをオーバーライドしている間は、省略可能なパラメータのデフォルト値を変更することはできません。メソッドシグネチャを変更しないのですか? –

答えて

12

なぜ "bbb bbb"が必要ですか?

あなたはaにインスタンスをキャストしているので、最初の呼び出しに、コンパイラへの唯一の情報は価値が使用されるものであることを"aaa"とバージョンですので、

キャストのない2番目のバージョンでは、コンパイラで"bbb"が表示されるため、の値はとなります。

多態性影響方法は、が呼び出され、が呼び出されますが、渡されたパラメータには影響しません。基本的に、デフォルト値は(呼び出しサイトで)コンパイラでを供給されているので、あなたのコードはに実際に等価です:"aaa""bbb"は、検査によって、コンパイル時を供給されている

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

解決された方法の

+3

したがって、再強調するために、デフォルト値は実行時ではなくコンパイル時に実装されますか? –

+1

@BolucPapuccuogluはい;私はもう少しでさらに強調して –

関連する問題