2013-05-01 12 views
12

"double in derived"を出力するメソッドが呼び出される理由は何でしょうか。私はC#の仕様でそれについて何の手がかりも見つけられませんでした。C#継承を使ったオーバーロードされたメソッドの呼び出し

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

私は7.4.2.2と7.4.2.3のルールを解読できますが、おそらく私よりもきれいですが、それはどこかにあります。 – spender

+0

@spender、そこにいるかもしれませんが、それはうまく書かれていません:)。 – Silvermind

答えて

6

ストレートC#の仕様(7.5.3オーバーロードの解決)から:

メソッド呼び出しの候補のセットはしていませんオーバーライド(§7.4)とマークされたメソッドを含み、のメソッドは、派生クラス内のメソッドが適用可能であれば、基底クラス内のメソッドは候補となりません(§7.6.5.1)。あなたの例では

Print(int x)をオーバーライドは候補ではないとPrint(double x)を適用することが可能であるので、それは、基本クラスのメソッドを考慮することなく、選択されます。

0

コンパイラが(表現のコンパイル時の型に基づいて)ほとんどの派生クラスで新たに宣言されたメソッドを見て、いずれかが適用されているか調べます。そうであれば、利用可能な「最良の」ものを使用します。

この質問への答えを参照してください:

Different behaviour of method overloading in C#

+2

元の回答へのリンクを引用してください。ありがとうございました。 –

+0

上記の回答へのリンクを追加しました。 – cvraman

関連する問題