2009-11-28 32 views
3

失败,我想知道为什么下面沮丧的失败@运行时间:为什么垂头丧气在运行时

的情况下1:

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

的情况下2:

Double y = 10.23; 
Console.WriteLine(y.GetType());//System.Double 
int z = (int)y;//success 
Console.ReadKey(); 

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

+0

(回复评论) – 2009-11-28 10:38:38

+0

Marc当然是对的。有关此类投射为何不合法的更长时间分析,请参阅有关此主题的文章:http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx – 2009-11-28 16:58:19

回答

11

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

必须正确地取消值的值类型(如int/double)。或者使用Convert.ToInt32(y),它具有嵌入的逻辑。

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

区别是object。箱子更换一切

+0

谢谢,我明白了这一点。 在第一种情况下,有其他方式的拆箱,而不是Convert.ToInt32(y) – Wondering 2009-11-28 10:36:19

+2

是的 - 你可以做'(int)(double)y',它解开(正确)到'double',然后*然后一个*转换*为'int'。 – 2009-11-28 10:37:48

+0

是的,工作。所以链是拳击 - >拆箱和 - - 转换。 感谢您的帮助。 – Wondering 2009-11-28 10:44:23

相关问题