为什么在.net 2.0中向原语(即:int)转换null会抛出空引用exception而不是无效的强制转换exception?

我正在浏览一些代码并遇到了我的combobox尚未初始化的情况。 这是在.NET 2.0中,在下面的代码中,this.cbRegion.SelectedValue为null。

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

此代码抛出了空引用exception,而不是无效的强制转换exception。 我想知道是否有人知道为什么它会抛出空引用exception而不是无效的强制转换?

它与拳击和拆箱有关。 它试图从框中取出一个int(unbox),但该对象为null,因此在获得转换更改之前,您将获得一个空引用exception。

如果你编译

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

看看MSIL代码,你会看到类似的东西

 ldnull ... unbox.any int32 

现在,unbox.any的行为指定如下:

如果obj不是盒装类型,则抛出InvalidCastException。

如果obj是空引用,则抛出NullReferenceException。

这是您在代码中看到的内容。

它试图在它投射之前读取对象。 因此,您将获得nullexception而不是强制转换exception。

“选定值”上的例外是null。 它甚至都没有进入演员表。