我想知道调用打印“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);
答案 0 :(得分:6)
直接来自C#规范(7.5.3过载分辨率):
方法调用的候选集不包括标记为覆盖的方法(第7.4节),如果中的任何方法,基类中的方法都不是候选方法派生类适用(§7.6.5.1)。
在您的示例中,覆盖 Print(int x)
不是候选者,Print(double x)
适用,因此无需考虑基类中的方法即可选择它。
答案 1 :(得分:0)
编译器查看在最派生类中新近声明的方法(基于表达式的编译时类型),并查看是否有适用的方法。如果是,则使用“最佳”可用。
请参阅此问题的答案: