使用继承的 C# 重载方法调用 [重复]

Posted

技术标签:

【中文标题】使用继承的 C# 重载方法调用 [重复]【英文标题】:C# Overloaded method invocation with Inheritance [duplicate] 【发布时间】:2013-04-25 10:49:23 【问题描述】:

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

【问题讨论】:

msdn.microsoft.com/en-us/library/aa691338%28v=vs.71%29.aspx 我可以破译7.4.2.2和7.4.2.3的规则,你可能比我聪明,但它会在某个地方。 @spender,它可能在里面,但是写得不好:)。 这个问题已经回答了。看到这个线程:***.com/questions/2821620/… @cvraman,即使给出相同的结果,该示例也略有不同。在这种情况下,整数文字也是 object 类型的(正在发生扩大转换)。然而,在上面给出的示例中,发生了隐式转换(从 int 到 double。) 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

查看这个问题的答案:

Different behaviour of method overloading in C#

【讨论】:

请引用并附上原始答案的链接。谢谢。 添加了指向上述答案的链接,其中引用来自

以上是关于使用继承的 C# 重载方法调用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

☀️ 学会编程入门必备 C# 最基础知识介绍——方法封装继承多态

使用超类引用调用重载的继承方法

C# 类型运算符重载在类继承中的调用测试

继承和方法重载

c#泛型方法重载

调用基类的重载方法[重复]