asp.net 选择错误的过载

k4aesqcs  于 2023-10-21  发布在  .NET
关注(0)|答案(2)|浏览(103)

好的,我有一个派生类,它有一个重载,指向我的基类上的一个方法。我调用了我认为与基类的方法签名匹配的方法,但却调用了我的派生类实现。(下面的代码总是打印出“MyDerived”)为什么会这样?

public class MyBase
    {
        public void DoSomething(int a)
        {
            Console.WriteLine("MyBase");
        }
    }

    public class MyDerived : MyBase
    {
        public void DoSomething(long a)
        {
            Console.WriteLine("MyDerived");
        }
    }

Main()
{
    MyDerived d = new MyDerived();
    d.DoSomething((int)5);
}
m1m5dgzv

m1m5dgzv1#

大多数人认为基类上的DoSomething(int)重载比DoSomething(long)重载更好。

然而,由于变量是派生类型,该版本的DoSomething将被调用。.NET运行时总是支持最派生的编译时类型

如果它找到一个方法签名,它将在移动到任何基类方法之前使用派生类型。一般来说,你应该避免重载基类中定义的方法。

zour9fqk

zour9fqk2#

你描述的行为是正确的。许多人认为这是违反直觉的,但它是精心设计的,以防止脆弱的基类失败。
请参阅我关于这个主题的文章了解更多细节。
https://learn.microsoft.com/en-us/archive/blogs/ericlippert/future-breaking-changes-part-three

相关问题