2008-12-11 122 views
3

我正在瀏覽一些代碼,遇到了我的combobox還沒有初始化的場景。這是在.NET 2.0中,在以下代碼中,this.cbRegion.SelectedValue爲null。爲什麼在.net 2.0中拋出null引用異常而不是無效的異常拋出異常(如:int)?

int id = (int)this.cbRegion.SelectedValue; 

此代碼拋出了空引用異常,而不是無效轉換異常。我想知道是否有人知道爲什麼它會拋出一個空引用異常而不是無效投射?

+0

它爲什麼會拋出異常?只是好奇心還是會導致一些其他問題? – 2008-12-11 22:39:24

回答

9

它與Boxing和拆箱。它試圖從盒子中取出一個int(unbox),但該對象爲null,所以在它獲得更改投射之前,您會得到一個空引用異常。

+0

閱讀文章後,它是有道理的 – 2008-12-11 22:49:45

+0

Quote:「http://msdn.microsoft.com/en-us/library/b95fkada(v=vs.80).aspx」 試圖unbox null或對不兼容的引用值類型將導致InvalidCastException。 – 2013-12-18 16:45:04

1

它試圖在轉換它之前讀取該對象。因此你得到了空的異常而不是轉換異常。

0

所選值爲空的異常。它從來沒有得到演員陣容。

+1

這不完全正確。它在試圖進行強制轉換時拋出,或者特別是取消空引用。 – liggett78 2008-12-11 22:54:20

7

如果編譯

object o = null; 
int a = (int)o; 

,並期待在MSIL代碼,你將看到類似

ldnull 
... 
unbox.any int32 

現在對於unbox.any的行爲規定如下:

如果obj 不是裝箱類型,則拋出InvalidCastException。

如果 obj是空引用,則拋出NullReferenceException。

這就是你在你的代碼中看到的。