2008-12-11 125 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。

这就是你在你的代码中看到的。