C# · 12月 23, 2021

有关内存中Caste C#引用类型的信息

如果我有两个类,A和B,其中B派生自A: class A {}class B : A { }

我可以非常高兴地将B的实例转换为A.

B b = new B();A a = b;

现在,我可以理解运行时如何确定底层类型是B,如ECMA-335(公共语言基础结构(CLI)分区I到VI)的第132页所述

Objects of instantiated types shall carry sufficient information to
recover at runtime their exact type (including the types and number of
their generic arguments). [Rationale: This is required to correctly
implement casting and instance-of testing,as well as in reflection
capabilities

那么,运行时如何知道虽然底层类型是B,但它实际上存储在A中.我知道我不会看到B上可用的方法,但如果底层类型是B,那么它存储存储位置A的类型?

那有意义吗?

解决方法 对象是B,CLI知道它是B.知道A的东西主要是编译器,然后将字段或local声明为A类(或者在某些情况下类似于方法链接,类型)通过该方法的返回类型已知,该方法被刻印到调用者的IL中.所以基本上:调用代码本身就是“我认为这是一个A”.作业等通常都是事先可以验证的,所以不存在弄错的风险.如果你试图破解IL故意弄错,运行时会告诉你并拒绝运行该方法.由于这些原因,将已知的B值分配给A本地/字段不需要任何类型检查 – 它只是一个直接分配.