C# 变量如何知道它实现的类型?

C# 变量如何知道它实现的类型?,c#,C#,正如我所知,每个变量都知道它的运行时类型 以下是一个例子: void Main() { C c = new C(); c.M(); I i = (I)c; i.M(); } public interface I { void M(); } public class C : I { void I.M() { Console.WriteLine("I.M"); } public void M()

正如我所知,每个变量都知道它的运行时类型

以下是一个例子:

void Main()
{
    C c = new C();
    c.M();
    I i = (I)c;
    i.M();
}

public interface I
{
    void M();
}

public class C : I
{
    void I.M() 
    {
        Console.WriteLine("I.M");
    }

    public void M() 
    {
        Console.WriteLine("M");
    }
}

如果我理解正确,
I
仍然知道它的类型是
C
。那么,是什么机制让
i
决定使用
i.M
而不是
M

在内部,每个对象都有自己的类型句柄,请参见下面的对象内部结构:

您想知道运行时方法绑定是如何工作的,也就是说,当编译时没有足够的信息精确编码到程序中时,运行时如何知道调用一个方法M而不是另一个方法M

这里有一个很好的练习:尝试编写一个具有这种行为的程序,而不使用该特性,因为它已经在运行时编写。通过这样做,您将了解实现运行时的人员是如何做到这一点的

我在这里完成了虚拟函数的练习:


阅读该系列文章,您将看到如何用一种没有虚拟分派的语言来模拟虚拟分派。我在文章中介绍的基本思想或多或少是虚拟分派在C#中的实际工作原理。接口分派在实践中有点棘手,但概念基本相同。

相关:只是为了澄清术语:变量只知道其类型限制是什么。引用类型的变量可以有一个值,该值是对对象的有效引用(或对无对象的空引用)。正是该对象知道其运行时类型。其背后的概念称为。的可能重复项