什么';It’这个方法正在重载

本文关键字:方法 重载 It 什么 | 更新日期: 2023-09-27 18:20:37

我有一个关于C#中方法重载的问题。我有一个家长班和一个孩子班。

class Parent
{
    public virtual string GetMyClassName()
    {
        return "I'm a Parent";
    }
}
class Child : Parent
{
    public override string GetMyClassName()
    {
        return "I'm a Child";
    }
}

我在这两个类之外声明了两个静态方法,它们作用于任何一种类型的对象:

static string MyClassName(Parent parent)
{
    return "That's a Parent";
}
static string MyClassName(Child child)
{
    return "That's a Child";
}

当我测试这些方法是如何调用的时,我得到了一个我认为奇怪的结果:

Parent p = new Child();
var str1 = MyClassName(p); // = "That's a Parent"
var str2 = p.GetMyClassName(); // = "I'm a Child"

为什么str1设置为"That’s a Parent"?我可能误解了C#中的方法重载。有没有办法强制代码使用Child调用(将str1设置为"That's a Child")?

什么';It’这个方法正在重载

为什么str1被设置为"That's a Parent"?

因为重载(通常)是在编译时确定的,而不是执行时。它完全基于目标和参数的编译时类型,使用dynamic值的调用除外。

在您的情况下,参数类型是Parent,因此它调用MyClassName(Parent)

有没有办法强制代码使用Child调用(将str1设置为"That's a Child")?

两种选择:

  • p声明为类型Child,而不是Parent
  • p声明为dynamic类型,这将强制在执行时执行重载解析

方法重载解析发生在编译时,而虚拟方法override的解析发生在运行时。

您对MyClassName()的调用在编译时被解析为Parent重载,因为p的类型是Parent。由于Child对象实际上也是Parent的实例(由于继承),所以这不是问题。(请注意,即使p引用Child对象,p instanceof Parent也是真的。)