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

12

我想知道为什么调用打印“派生类中的double”的方法。在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);

http://msdn.microsoft.com/en-us/library/aa691338%28v=vs.71%29.aspx - spender
如果您能破译7.4.2.2和7.4.2.3的规则,您可能比我更聪明,但它一定会在那里。 - spender
3
已经有人回答了这个问题。请看这篇帖子:https://dev59.com/a3E85IYBdhLWcg3wViE4 - cvraman
1
@cvraman,那个例子稍有不同,即使它产生了相同的结果。在那种情况下,整数字面量也是对象类型(发生了扩展转换)。然而,在上面给出的例子中,隐式转换正在发生(从int到double)。 - Drew Noakes
有人知道为什么如果您像这样声明Print方法,它就不会发生吗? public new void Print(int x)(隐藏基本的Print方法)。如果您只将其声明为public void Print(int x)并删除基类,则会发生相同的情况。然后调用int方法。似乎来自继承。 - Michael Schnerring
显示剩余4条评论
2个回答

6
直接引自C#规范(7.5.3重载决议):
“方法调用的候选集不包括标记为override(§7.4)的方法,并且如果派生类中的任何方法可应用(§7.6.5.1),则基类中的方法不是候选者。”
在你的例子中,被重写的Print(int x)不是一个候选者,而Print(double x)是可应用的,因此它被选择而无需考虑基类中的方法。

0
编译器会查看在最派生类中新声明的方法(基于表达式的编译时类型),并查看是否有任何适用的方法。如果有,它将使用可用的“最佳”方法。
请参阅此问题的答案: C#中方法重载的不同行为

2
请提供报价并附上原答案链接。谢谢。 - Eren Ersönmez
在上面的回答中添加了一个链接,该引用来自于那里。 - cvraman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接