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