如何使用重载和重写方法解释此行为?

mic*_*ael 16 c# virtual-functions overloading

任何人都可以这么好,并解释为什么这个代码显示Derived.DoWork(double).我可以为这种行为提出一些解释,但我希望有人为我澄清这一点.

using System;

public class Base
{
    public virtual void DoWork(int param) {
        Console.WriteLine("Base.DoWork");
    }
}

public class Derived : Base
{
    public override void DoWork(int param) {
        Console.WriteLine("Derived.DoWork(int)");
    }

    public void DoWork(double param) {
        Console.WriteLine("Derived.DoWork(double)");
    }

    public static void Main() {
        int val = 5;
        Derived d = new Derived();
        d.DoWork(val);
    }
}
Run Code Online (Sandbox Code Playgroud)

Sri*_*vel 10

埃里克·利珀特曾经说过"更接近更好".

首先在派生类中声明的方法比在基类中首先声明的方法更接近.

因此,从上面的链接,派生类更接近因此被选择.

仔细实现此行为以避免脆弱的基类问题

为了完整性,我将分享子弹:

  • 首先在派生类中声明的方法比在基类中首先声明的方法更接近.

  • 嵌套类中的方法比包含类中的方法更接近.

  • 接收类型的任何方法都比任何扩展方法更接近.

  • 在嵌套命名空间中的类中找到的扩展方法比在外部命名空间中的类中找到的扩展方法更接近.

  • 在当前命名空间的类中找到的扩展方法比在using指令提到的命名空间中的类中找到的扩展方法更接近.

  • 在using指令中提到的命名空间中的类中找到的扩展方法(其中指令位于嵌套命名空间中)比在using指令中提到的命名空间中的类中找到的扩展方法更接近,其中该指令位于外部命名空间中.

  • 我测试了它,如果有人好奇,VB.NET会调用Integer版本.不同语言团队的有趣选择. (2认同)