12

「派生で倍増」を出力するメソッドの呼び出しの理由は何だろうか。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);
4

2 に答える 2

6

C# 仕様 (7.5.3 オーバーロードの解決) から直接:

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

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

于 2013-05-01T13:07:14.730 に答える
0

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

この質問への回答を参照してください。

C# でのメソッドのオーバーロードの異なる動作

于 2013-05-01T13:06:54.923 に答える