试图将boxed int强制转换为byte

Moe*_*sko 7 .net c# casting c#-2.0

代码说明:

        int i = 5;
        object obj = i;
        byte b = (byte)obj; // X
Run Code Online (Sandbox Code Playgroud)

运行时,会在"X"行生成System.InvalidCastException("指定的强制转换无效").做双重演奏:

        byte b = (byte)(int)obj;
Run Code Online (Sandbox Code Playgroud)

我本以为你应该能够将一个盒装的int(如果它的值在0..255范围内)转换成一个字节.任何人都可以对此有所了解吗?

(这是.net 2.0,如果重要的话).

Aar*_*ght 19

您所看到的行为差异是身份和表现之间的差异.

拆箱是一种标识转换和一种表示保留操作.然而,int将a 转换为a 表示正在改变(因为可能会丢失精度).byte

InvalidCastException当你尝试将其打包int为a 时,你会得到一个,byte因为盒装值的标识不是a byte,它是一个int.当你写byte b = (byte)obj,你说的是运行时,我知道什么是在那里一个byte,但你真正的意思是说,我觉得在那里有什么可以转化byte.

为了制作后一种语句,首先必须声明对象的身份,这是一个int.然后,只有这样才能进行表示改变转换byte.

请注意,即使目标类型为"较大" - 即a Int64. 目标类型不在源类型的继承树中的所有显式转换都被视为表示更改.并且由于所有类型都来自System.Object,因此根据定义拆箱不能改变表示.


Igo*_*aka 5

MSDN明确表示,取消装箱到另一种类型会抛出一个InvalidCastException.

我的理解是,取消装箱变量的类型实际上是底层CIL装配命令的参数.它unbox实际上是操作码InvalidCastException.

如果对象未设置为valType,则抛出InvalidCastException.