C#带继承的重载方法调用
我想知道调用打印“double-in-derived”的方法的原因是什么。我在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
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)。请引用并包含指向原始答案的链接。谢谢。添加了上述答案的链接,引用自