请考虑以下代码:
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)
任何人都能解释我是如何获得第二个HelloA的,因为我期待HelloB?
答案 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
。