2012-09-17 391 views
3

爲什麼C#不能將long var隱式轉換爲對象var然後是ulong?將長對象轉換爲對象

long a = 0; 
    Object c = a; 
    ulong b = (ulong)c; // throw exception here 
+0

看到這個問題:http://stackoverflow.com/questions/1080945/why-cant-i-pull-a-ushort-from-a-system-object-and-then-cast-it-as-a -uint -c/1080957#1080957 –

回答

6

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

Object c = a 

箱一個它是一個長期的

ulong b = (ulong)c; 

試圖拆箱C作爲ULONG但它是一個很長,因此失敗。

ulong b = (ulong)((long)c); 

會起作用,因爲它會將c取消裝箱。 c長這會工作,你可以投很長時間ulong

+0

你可以去'ulong b =(ulong)(long)c',儘管(溢出和下溢不能抵抗)。 – akton

+0

@akton正確。我想對錶達式進行明確的評估,因此額外設置了() –

+0

感謝您的回答! – ricky

0

簡單和簡單的答案:beacuse長和ulong不是相同的類型。一個是長簽名,另一個是無簽名長簽名。

4

如果您填入值類型T,則只能將其作爲自身或作爲Nullable(T?)進行拆箱。 其他演員無效。

這是因爲來自對象的強制轉換永遠不會被解釋爲轉換,而是long和ulong之間的轉換。

因此,這是合法的:

var c = (long) b; 

這也是合法的:

var c = (long?) b; 

但是,這並不:

var c = (ulong) b; 

做你想做什麼,你必須投了兩次:第一次只拆箱,第二次是實際轉換:

var c = (ulong)(long) b; 

欲瞭解更多信息,請參閱blog post by Eric Lippert

+0

優秀的參考資料,我只是在尋找。 – Freeman

+0

哈,謝謝你的幫助。您的鏈接非常有用。這正是我正在尋找的! – ricky