6

ECMA-335,1.8.2.4,指定可装箱类型包括引用类型(不包括托管指针/byrefs)和泛型参数。

装箱引用类型的目的是什么?与未装箱的参考对象相比,装箱的参考对象的功能和内存表示有什么不同吗?

4

2 回答 2

5

装箱引用类型引用在逻辑上没有任何问题。这只是一个无操作,没有任何变化。

但是 Ecma-335 并不总是能很好地描述.NET CLR中真正实现的内容。当要求对不是值类型的值进行装箱时,实现 Opcodes.Box 的 JIT_Box() 辅助函数实际上会抛出 InvalidCastException。它期望编译器和抖动知道何时在不需要时抑制装箱转换。他们是这样。

于 2013-10-23T18:50:36.463 回答
3

考虑通用函数:

object MyBox<T>(T value)
{
    return (object)value;
}

这编译为:

ldarg.1     
box         01 00 00 1B 
ret

如果是引用类型,则此函数的预期行为是无操作T,将值装箱到自身。

将已知为引用类型的值装箱不太有用,但以与泛型一致的方式指定它是简单且一致的。

于 2013-10-23T20:26:01.683 回答