拳击/拆箱 - 仅限值类型?Ref.types - 铸造?

Loj*_*jol 2 c# boxing unboxing casting

从MSDN我读到装箱/拆箱用于将类型视为对象.但是当我读到关于ArrayList的内容时,它会读到它也会装箱.所以我很困惑,因为ArrayList将值和引用类型保存为对象.另外,在术语方面,以下不是拆箱,它只是铸造?

ArrayList a=new ArrayList();
a.Add(someClass);

someClass x=(someClass)a[0];
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

ArrayList对值类型执行装箱,但不对引用类型执行装箱.或者更确切地说,ArrayList本身不会进行拳击 - 编译器会这样做.例如:

ArrayList list = new ArrayList();
list.Add(5);
Run Code Online (Sandbox Code Playgroud)

是有效的

ArrayList list = new ArrayList();
object boxed = 5; // Perform boxing from value type type
list.Add(boxed);
Run Code Online (Sandbox Code Playgroud)

您的示例确实只是强制转换 - 引用转换,而不是取消装箱转换.引用类型值不需要加框以存储在ArrayList- 它已经是引用.

再一次,拳击一般都是如此,而不是特定的ArrayList.拳击只是一种使用值类型值的方法,你真正想要一个引用...引用必须是一个对象,所以CLR创建一个对象来包装值类型值,并返回对该包装器的引用(存储值的"盒子").