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

标签 c# .net dynamic clr

我这里有这段代码:

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/

相关文章:

c# - 如何创建一个动态相等实现,您可以在其中传递要比较的属性名称?

c# - 在 asp.net MVC 中读取文本文件时出错

c# - 将鼠标点击发送到另一个应用程序的 X Y 坐标

c# - Azure KeyVault 配置提供程序在更改时重新加载值

c# - Xml反序列化,跨不同标签保持顺序

c# - ASP.NET DropDownValue 不会跨 webfarm 中的一台服务器持久保存

powershell - 如何在PowerShell中将字符串值转换为动态数据类型?

c# - INotifyPropertyChanged 绑定(bind)到对象本身而不是属性时

c# - 在 c# asp.net 中执行 javascript 后抓取网页

java - Java中的动态转换