为什么downcast在运行时失败

Won*_*ing 3 c# casting

我想知道为什么下面的downcast失败@运行时间:

情况1:

Object y = 10.23;
Console.WriteLine(y.GetType()); //System.Double
int z = (int)y;// fails @ runtime
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)

案例2:

Double y = 10.23;
Console.WriteLine(y.GetType());//System.Double
int z = (int)y;//success
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,y的类型是System.Double,仍然为什么在第一种情况下downcst失败?

Mar*_*ell 11

在第一个例子中; 拆箱(你展示的)与向下转换或转换不同 ; 或许不幸的是,C#对所有3使用相同的语法.

必须正确地取消装箱值类型(例如int/double).或者使用Convert.ToInt32(y)哪个具有嵌入的逻辑.

在第二个示例中,这是一个转换(不是unbox,而不是downcast).转换在语言规范中定义(如本例中)或通过自定义静态运算符定义.

不同的是object.盒子改变了一切.

  • 是的 - 你可以做`(int)(double)y`,它将(正确)解包为`double`,然后*然后*将*转换*转换为`int`. (2认同)
  • 这些规则可以归结为:1)源参考类型,目标参考类型 - 上行/下行/接口情况; 2)源参考类型,目标值类型 - 拆箱; 3)源值类型,目标引用类型 - 装箱; 4)源值类型,目标值类型 - 转换.在这4个中,只有最后一个涉及实际扩大或缩小转换.当然,这都假设没有重载转换运算符,因为那些可以做任何他们想做的事情. (2认同)