代码说明:
int i = 5;
object obj = i;
byte b = (byte)obj; // X
运行时,这会在“X”行生成一个 System.InvalidCastException(“指定的转换无效”)。做双重 Actor 作品:
byte b = (byte)(int)obj;
我本以为您应该能够将装箱的 int(如果它的值在 0..255 范围内)转换为字节。任何人都可以阐明这一点吗?
(这是在 .net 2.0 中,以防万一)。
最佳答案
您看到的行为差异是 identity and representation 之间的差异.
拆箱是一种身份转换,也是一种保留表示的操作。然而,将 int
转换为 byte
会改变表示(因为存在潜在的精度损失)。
当您尝试将 int
拆箱为 byte
时,您会得到一个 InvalidCastException
,因为 identity装箱值不是 byte
,它是 int
。当你写 byte b = (byte)obj
时,你是在告诉运行时,我知道里面有什么是一个byte
,但您真正想说的是,我认为可以将其中的内容转换为字节
。 p>
为了进行后一种声明,您首先必须声明对象的身份,它是一个int
。然后,也只有到那时,您才能对 byte
进行表示更改转换。
请注意,即使目标类型“更大”——即 Int64
,这也适用。 所有 目标类型不在源类型的继承树中的显式转换都被认为是表示更改。由于所有类型都派生自 System.Object
,根据定义拆箱不能更改表示。
关于c# - 尝试将装箱的 int 转换为 byte,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2970967/