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,因此根据定义拆箱不能改变表示.