天天看点

一个测试理解装箱和取消装箱

问题:在c#中,“(long)((object)(int 10))”工作吗?

    这句代码涉及到了装箱和拆箱的知识点,让我们先看一下概念:

  • 装箱转换是指将一个值类型隐式地转换成一个object 类型,或者把这个值类型转换成一个被该值类型应用的接口类型interface-type。把一个值类型的值装箱,也就是创建一个object 实例并将这个值复制给这个object。
  • 和装箱转换正好相反,拆箱转换是指将一个对象类型显式地转换成一个值类型,或是将一个接口类型显式地转换成一个执行该接口的值类型。

    那么显然,这个问题就是装箱再拆箱的问题。

    当我们调试这行代码时,程序报错"无法将xxx作为long取消装箱"。这问题出在哪里呢?

    拆箱的过程分为两步:首先,检查这个对象实例,看它是否为给定的值类型的装箱值。然后,把这个实例的值拷贝给值类型的变量。图示如下:

一个测试理解装箱和取消装箱

    所以,将值为 int 的 object 转换 long 类型的值类型时,会检查 object 的值类型是否为 long,这里是 int,程序抛错。而这是编译器不会检查到的 bug,所以需要留意。