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 回答