C#泛型类型干扰奇怪的行为

时间:2017-09-12 11:47:26

标签: c# generics polymorphism

请考虑以下代码:

class Program
{
    static void Main(string[] args)
    {
        var a = new A();
        var b = new B();
        Print(a);
        Print(b);
        Console.WriteLine(b.Hello);
        Console.ReadLine();
    }

    static void Print<T>(T t) where T : A
    {
        Console.WriteLine(typeof(T));
        Console.WriteLine(t.GetType());
        Console.WriteLine(t.Hello);
    }
}

public class A
{
    public string Hello { get { return "HelloA"; } }
}

public class B : A
{
    public new string Hello { get { return "HelloB"; } }
}

我得到的输出(.NET FW 4.5)

  • //打印(a)中
  • A
  • A
  • HelloA
  • //打印(b)中
  • HelloA
  • //明确的文字书
  • HelloB

任何人都能解释我是如何获得第二个HelloA的,因为我期待HelloB?

1 个答案:

答案 0 :(得分:5)

public new string Hello { get { return "HelloB"; } }

new关键字会创建一个 new 函数,该函数恰好与旧函数同名。因此,B现在有两个方法:Hello(A),在通过编译时类型A的变量调用时执行,以及Hello(B),当通过编译时类型B(或其子类型)的变量调用时执行。

由于您的通用参数为T : A,编译器会将t.Hello编译为Hello(A)的调用。

B shadows (或隐藏)方法Hello,而不是覆盖它。

你可能想写的是:

public class A
{
    public virtual string Hello { get { return "HelloA"; } }
}

public class B : A
{
    public override string Hello { get { return "HelloB"; } }
}

请注意,基本方法声明为virtual,子类方法声明为override