gpt4 book ai didi

c# - 在对子类使用 'dynamic' (C#) 时,.NET 4 如何决定调用哪个方法?

转载 作者:太空宇宙 更新时间:2023-11-03 23:08:03 25 4
gpt4 key购买 nike

我这里有这段代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com