我这里有这段代码:
class A
{
public void Method()
{
Console.WriteLine("A");
}
}
class B: A
{
public new void Method()
{
Console.WriteLine("B");
}
}
class Program
{
static void Main(string[] args)
{
A v1 = new B();
v1.Method();
dynamic v2 = v1;
v2.Method();
Console.ReadKey();
}
}
输出是:
一个
B
我试图理解为什么在使用 dynamic 作为变量 v2 的类型时,会调用 B.Method()。我知道,因为 B.Method() 是使用 new 声明的,所以它是与 A.Method() 不同的方法,它只是具有相同的签名。如果我将变量 v2 声明为 B(并进行强制转换),代码会按照我的预期进行,打印出 B。
那么,为什么dynamic 使 .NET 将 v2 视为 B 而不是 A?
谢谢!
最佳答案
唯一一条提示 v2
应该被视为 A
而不是 B
的信息是 compile- v1
的时间类型。当您将 v1
分配给 v2
时,您要求运行时丢弃在编译时可能已知的关于 v2
的所有内容,并计算找出运行时 Method
指的是什么,除了对象本身没有其他信息,它的运行时类型为 B
。
当出现具有非虚拟隐藏方法的运行时类时,运行时绑定(bind)器可能会选择使用派生最少的类而不是派生最多的类。使用最派生的适合该类型的“自然”使用;这与使用 var v3 = new B(); 得到的方法相同v3.Method();
.
关于c# - 在对子类使用 'dynamic' (C#) 时,.NET 4 如何决定调用哪个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40469741/