2011-04-11 44 views
1

此抛出要说源不能被铸造到目的地的异常:C#铸造INT浮动抛出异常(在运行时)

int a = 1; 
object b = (object)a; 
float c = (float)b; // Exception here 

为什么?

+3

[Why \ [(int)(object)10m; \]确实抛出“指定的转换无效”异常?](http://stackoverflow.com/questions/3953391/why-intobject10m-does-throw-specified-cast-is-not-valid-exception) – 2011-04-11 22:30:03

回答

5

您只能投盒装结构的确切类型,所以你需要投下第一INT:

float c = (float)(int)b; 

但是因为有一个隐式转换从int浮动,你可以这样做:

float c = (int)b; 
1

据我知道那是因为你存储箱“a”作为一个int之后,你拆箱它作为一个浮动,这不会工作...

得到它的权利,你应该做的浮法C =( float)(int)b;

1

您不能将一个数据类型的值从一种数据类型转换为另一种数据类型。您需要先将其恢复到原来的类型,然后将其拉出。或者,您可以使用Convert.To*方法,例如

Object a = 6; 
Double b = Convert.ToDouble(a); 

后续:http://www.ideone.com/hgeob

0

的问题是,同样的语法(从C的历史问题),重复使用3个操作:

  1. 拳击/拆箱值
  2. 转换号码
  3. 铸造

int a = 1; // Ok 
object b = (object)a; // Ok. int is struct so we may box it into object 
float c = (float)a; // Ok. Conversion from integer to float 
float c = (float)b; // Error. object b is not boxed float 
+0

UL/OL对解析器很有趣,你需要在它们之间添加一些东西。在这种情况下,我使用了一个任意的虚假HTML标签(如调用格式,但不会干扰帖子本身)。 – 2011-04-11 22:38:15