问题:在c#中,“(long)((object)(int 10))”工作吗?
这句代码涉及到了装箱和拆箱的知识点,让我们先看一下概念:
- 装箱转换是指将一个值类型隐式地转换成一个object 类型,或者把这个值类型转换成一个被该值类型应用的接口类型interface-type。把一个值类型的值装箱,也就是创建一个object 实例并将这个值复制给这个object。
- 和装箱转换正好相反,拆箱转换是指将一个对象类型显式地转换成一个值类型,或是将一个接口类型显式地转换成一个执行该接口的值类型。
那么显然,这个问题就是装箱再拆箱的问题。
当我们调试这行代码时,程序报错"无法将xxx作为long取消装箱"。这问题出在哪里呢?
拆箱的过程分为两步:首先,检查这个对象实例,看它是否为给定的值类型的装箱值。然后,把这个实例的值拷贝给值类型的变量。图示如下:
所以,将值为 int 的 object 转换 long 类型的值类型时,会检查 object 的值类型是否为 long,这里是 int,程序抛错。而这是编译器不会检查到的 bug,所以需要留意。