试图将boxed int转换为byte

代码说明:

int i = 5; object obj = i; byte b = (byte)obj; // X 

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

  byte b = (byte)(int)obj; 

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

(这在.net 2.0中,如果重要的话)。

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

拆箱是一种标识转换和一种表示保留操作。 但是,将int转换为byte表示更改 (因为可能会丢失精度)。

当您尝试将int作为一个byte取消打包时,您会收到InvalidCastException ,因为盒装值的标识不是一个byte ,而是一个int 。 当你写byte b = (byte)obj ,你告诉运行时, 我知道那里一个byte ,但你真正想说的是, 我认为那里的东西可以转换成一个byte

为了生成后一个语句,首先必须声明对象的标识 ,这是一个int 。 然后,只有这样才能将表示转换为byte

请注意,即使目标类型为“较大”(即Int64 ,这也适用。 目标类型不在源类型的inheritance树中的所有显式转换都被视为表示更改。 由于所有类型都派生自System.Object ,因此按定义拆箱不能更改表示。

MSDN明确表示对另一种类型进行拆箱会抛出InvalidCastException

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

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