这可以按预期工作:
byte b = 7;
var i = (int)b;
虽然这会引发InvalidCastException
:
byte b = 7;
object o = b;
var i = (int)o;
当基础类型仍为object
时,为什么投射会从byte
失败?
答案 0 :(得分:6)
由于byte
明确转换为int
,但object
没有。{/ p>
如果您告诉编译器object
真的 byte
,那么它将再次允许您明确地转换为int
。
byte b = 7;
object o = b;
var i = (int)((byte)o);
参考文献:
答案 1 :(得分:1)
这是由boxing and unboxing的CLR使用引起的。每当您将值类型视为对象时,CLR将自动在Object中为您键入此值类型。但是,CLR仅根据MSDN支持将取消装箱的盒装对象转换为原始值类型:
<强>开箱强>
取消装箱是从类型对象到值的显式转换 键入或从接口类型到实现该类型的值类型 接口。拆箱操作包括:
检查对象实例以确保它是给定值类型的装箱值。
将实例中的值复制到value-type变量中。
object o = b;
使CLR创建一个盒装字节,并将其作为Object存储在o中。 var i = (int)o;
然后尝试将盒装字节解压缩为int。这会导致异常,因为盒装类型(字节)和值类型(int)不同。
答案 2 :(得分:0)
您必须首先从对象获取字节,然后才能将转换为整数。
这样的事情:
var i = (int)(byte)o;