2010-06-04 30 views
7

代碼來說明:試圖投裝箱的int到字節

 int i = 5; 
     object obj = i; 
     byte b = (byte)obj; // X 

運行時,此產生一個System.InvalidCastException(「指定的轉換無效」)在線「X」。做一個雙投的工作原理:

 byte b = (byte)(int)obj; 

我本來以爲你應該能夠投裝箱的int(如果它在範圍0..255中的值)字節。任何人都可以對此有所瞭解嗎?

(這是在.net 2.0中,以防萬一)。

回答

18

您所看到的行爲差異是identity and representation之間的差異。

開箱是身份鑄造和表示保留操作。然而,將int鑄造成byte,但是,表示改變(因爲存在潛在的精度損失)。

當您嘗試拆箱int當你的InvalidCastException一個byte因爲裝箱值的身份不是byte,它是一個int。當你寫byte b = (byte)obj,你說的是運行時,我知道這裏面有什麼了一個byte,但你真正的意思是說,我覺得在那裏有什麼可以轉換byte

爲了使後者聲明,您首先必須聲明該對象的標識,該標識是int。然後,只有這樣你纔可以進行改變圖形的轉換爲byte

注意,這適用即使目標類型爲「大」 - 即一個Int64所有顯式轉換爲其目標類型不在源類型的繼承樹被認爲是表徵改變。由於所有類型從System.Object派生,定義拆箱不能改變表示。

+0

感謝Aaronaught,這很好地解釋了它。 – 2010-06-04 02:01:58

5

MSDN explicitly says拆箱到不同的類型會拋出InvalidCastException

我的理解是變量取消裝箱的類型實際上是underlying CIL assembly command的參數。它是unbox操作碼,實際上是拋出InvalidCastException

如果 對象沒有裝箱爲valType,則引發InvalidCastException。