C# 什么';这个方法重载是怎么回事?

C# 什么';这个方法重载是怎么回事?,c#,overloading,C#,Overloading,我对C#中的方法重载有一个问题。我有一个父类和一个子类 class Parent { public virtual string GetMyClassName() { return "I'm a Parent"; } } class Child : Parent { public override string GetMyClassName() { return "I'm a Child"; } } 我在这两个类

我对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
设置为“那是一个家长”?我可能误解了C#中的方法重载。有没有办法强制代码使用子调用(将str1设置为“That's a Child”)?

方法重载在编译时进行解析,而虚拟方法重写在运行时进行解析

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

为什么str1被设置为“那是一个父级”

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

在您的例子中,参数类型是
Parent
,因此它调用
MyClassName(Parent)

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

两种选择:

  • p
    声明为
    子类
    ,而非
    父类
  • p
    声明为
    dynamic
    类型,这将强制在执行时执行重载解析

供参考:选项3:调用一个方法,然后检查类型。哇,我以前从未遇到过在Excel com互操作调用之外使用
动态
。谢谢