为什么这个类型转换会导致错误?

时间:2011-10-28 14:45:41

标签: c# .net casting

这可以按预期工作:

byte b = 7;
var i = (int)b;

虽然这会引发InvalidCastException

byte b = 7;
object o = b;
var i = (int)o;

当基础类型仍为object时,为什么投射会从byte失败?

3 个答案:

答案 0 :(得分:6)

由于byte明确转换为int,但object没有。{/ p>

如果您告诉编译器object 真的 byte,那么它将再次允许您明确地转换为int

byte b = 7;
object o = b;
var i = (int)((byte)o);

参考文献:

Casting and Type Conversions
byte

答案 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;