2010-09-08 102 views
2

下面的代碼(至少對我來說)的行爲奇怪:爲什麼此轉換不起作用?

int testValue = 1234; 

this.ConversionTest(testValue); 

private void ConversionTest(object value) 
{ 
    long val_1 = (long) (int) value; // works 
    long val_2 = (long) value;  // InvalidCastException 
} 

我不明白爲什麼直接的(明確的)強制轉換爲長不起作用。 有人可以解釋這種行爲嗎?

感謝

+0

這是一個非常常見的問題。關於這個問題的文章在這裏: http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx – 2010-09-08 15:09:01

+0

請注意,這是許多以前的重複堆溢出問題,如這一個:http://stackoverflow.com/questions/1812172或這一個:http://stackoverflow.com/questions/2651754或這一個:http://stackoverflow.com/questions/1667169或這一個:http://stackoverflow.com/questions/1085097 – 2010-09-08 15:10:12

回答

3

ConversionTest方法的value參數的類型爲object;這意味着傳遞給該方法的任何值類型(例如int)都將被裝箱。

盒裝的值只能是拆箱完全相同的類型:

  • 當你做(long)(int)value你先拆箱valueint(原來的類型),然後將那intlong
  • 當你做(long)value你試圖解開盒子intlong,這是非法的。