当我在编译器或运行时级别对引用类型和值类型执行转换以及反之亦然(装箱和取消装箱)时会发生什么? 任何机构可以解释以下四种情况吗?如果我错过任何一种情况,请随时添加条件。
1. Stream stream = new MemoryStream();
MemoryStream memoryStream = (MemoryStream) stream;
2. double k=10.0;
int l = (int)k;
3. object k =20;
int l = (int)k;
4. int k =23;
double m = k;
答案 0 :(得分:4)
此处有三种类型的转化:
转换1是参考转换。 CLR将检查stream
的值是否实际对MemoryStream
(或子类型)的引用,然后将引用复制到memoryStream
。没有创建新对象或类似的东西。之后,stream
和memoryStream
都指向相同的对象。两个变量的值在内存中完全相同。
转化2和4是数字转换 - 它们从一种数字形式转换为另一种数字形式。这基本上是FPU类型的操作。转换2是显式的(因为它可能会丢失信息),而转换4是隐含的,但从根本上说它们是相似的,因为它们都在改变实际的表示。
转换3是一个拆箱操作:CLR检查k
的值是否是对盒装int的引用(或兼容类型,例如基础类型为int
的枚举) ,并将该框中的值复制到l
。
您可以通过编译代码然后使用ildasm或Reflector来查看为所有这些生成的IL。
Eric Lippert有一个blog post关于所有这些你可能会觉得有用的内容。