2015-06-14 51 views
1

我們可以將int轉換爲long
爲什麼下面這段代碼給出了運行時錯誤。C#長數據類型拆箱問題

object o = 9; 
long i = (long)o; 
Console.WriteLine(i); 

我是C#的新手。

+0

什麼錯誤和在哪裏? – Alejandro

+0

它給了我InvalidCastException – Indranil

+0

'o'是一個盒裝的int,所以你在鑄造之前首先必須解開底層的值類型,然後才能將'(long)(int)o' – chomba

回答

3

this bit of documentation

對於值類型的開箱在運行時成功,的項目是裝箱必須是先前由拳擊該值類型的實例創建一個對象的引用。嘗試解除空箱或對不兼容的值類型的引用將導致InvalidCastException。

所以,你必須拆箱到int,然後再轉換爲long(隱式轉換存在):

object o = 9; 
long i = (int)o; 
1

因爲int和long都是值類型,所以它們按值複製,而不是像引用類型那樣引用(例如object)。所以o是一個引用類型,所以int對象是通過引用存儲的。爲了將它放入一個值類型的新變量中,您需要具有一些實際可以複製到其中的值。

所以你需要將對象轉換爲實際類型(INT)第一,然後才能執行一種類型轉換長:

object o = 9; 
long i = (long)(int)o; 

你不一定需要做(long)但正如在long中存儲值時會隱式發生。

+1

或者你可以聲明爲: 'object o = 9L'。哪一個會明確地將'object'聲明爲'long' –

5

現有的答案正確地解釋爲什麼你會得到一個例外,但真的不顯示你可以做什麼。首先鑄造到int是典型的答案,但只有當您知道原始值是int時纔有效。如果原始值可能是intlong,那麼拆箱作爲int也可能會失敗。

將代碼更改爲有效的簡單方法是不要試圖自己動手。 .NET Framework已經有一種方法可以完成你想要的功能:Convert.ToInt64。所以只寫

long i = Convert.ToInt64(o); 

,讓任何內部所需的中間類型轉換運行時的擔心。