微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有关内存中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本地/字段不需要任何类型检查 – 它只是一个直接分配.

原文地址:https://www.jb51.cc/csharp/91722.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐