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

Ric*_*d R 3 .net c# casting .net-2.0

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

int id = (int)this.cbRegion.SelectedValue;
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*sio 9

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


lig*_*t78 8

如果你编译

object o = null;
int a = (int)o;
Run Code Online (Sandbox Code Playgroud)

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

ldnull
...
unbox.any int32
Run Code Online (Sandbox Code Playgroud)

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

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

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

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