ECMA-335,1.8.2.4,指定可装箱类型包括引用类型(不包括托管指针/byrefs)和泛型参数。
装箱引用类型的目的是什么?与未装箱的参考对象相比,装箱的参考对象的功能和内存表示有什么不同吗?
装箱引用类型引用在逻辑上没有任何问题。这只是一个无操作,没有任何变化。
但是 Ecma-335 并不总是能很好地描述.NET CLR中真正实现的内容。当要求对不是值类型的值进行装箱时,实现 Opcodes.Box 的 JIT_Box() 辅助函数实际上会抛出 InvalidCastException。它期望编译器和抖动知道何时在不需要时抑制装箱转换。他们是这样。
考虑通用函数:
object MyBox<T>(T value)
{
return (object)value;
}
这编译为:
ldarg.1
box 01 00 00 1B
ret
如果是引用类型,则此函数的预期行为是无操作T
,将值装箱到自身。
将已知为引用类型的值装箱不太有用,但以与泛型一致的方式指定它是简单且一致的。