2011-04-11 45 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