C#带继承的重载方法调用

C#带继承的重载方法调用,c#,inheritance,overloading,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.Write

我想知道调用打印“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);

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

请参见此问题的答案:

直接从C#规范(7.5.3过载分辨率)中获得:

方法调用的候选集不包括标记为override的方法(§7.4),如果派生类中的任何方法适用(§7.6.5.1),则基类中的方法不是候选方法


在你的例子中,重写<代码>打印(int x)< /> >不是候选项,<代码>打印(double x)是适用的,所以它不需要考虑基类中的方法而被选中。

你可以破译7.4.2.2和7.4.2.3的规则,你可能比我聪明,但是它会在某个地方。它可能在那里,但写得很差:)。这已经得到了回答。看这个帖子:@cvraman,这个例子有点不同,即使它给出了相同的结果。在这种情况下,整型文字也是object类型(正在进行加宽转换)。但是,在上面给出的示例中,正在进行隐式转换(从int到double)。请引用并包含指向原始答案的链接。谢谢。添加了上述答案的链接,引用自