C#使用继承重载方法调用

时间:2013-05-01 12:33:14

标签: c# inheritance overloading

我想知道调用打印“double in derived”的方法的原因是什么。我没有在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);

2 个答案:

答案 0 :(得分:6)

直接来自C#规范(7.5.3过载分辨率):

  

方法调用的候选集不包括标记为覆盖的方法(第7.4节),如果中的任何方法,基类中的方法都不是候选方法派生类适用(§7.6.5.1)。

在您的示例中,覆盖 Print(int x)不是候选者,Print(double x)适用,因此无需考虑基类中的方法即可选择它。

答案 1 :(得分:0)

编译器查看在最派生类中新近声明的方法(基于表达式的编译时类型),并查看是否有适用的方法。如果是,则使用“最佳”可用。

请参阅此问题的答案:

Different behaviour of method overloading in C#