我正在浏览一些代码,并遇到了我的组合框尚未初始化的情况。这是在 .NET 2.0 和以下代码中,this.cbRegion.SelectedValue 为空。
int id = (int)this.cbRegion.SelectedValue;
此代码引发了一个空引用异常,而不是一个无效的强制转换异常。我想知道是否有人知道为什么它会抛出空引用异常而不是无效转换?
它与装箱和拆箱有关。它试图从盒子中取出一个 int(拆箱),但该对象为空,因此在它获得要转换的更改之前,您会得到一个空引用异常。
如果你编译
object o = null;
int a = (int)o;
并查看 MSIL 代码,您会看到类似
ldnull
...
unbox.any int32
现在 unbox.any 的行为指定如下:
如果 obj 不是装箱类型,则会引发 InvalidCastException。
如果 obj 是空引用,则会引发 NullReferenceException。
这就是您在代码中看到的内容。
它试图在投射之前读取对象。因此,您得到的是空异常而不是强制转换异常。
例外是选定的值为空的值。它甚至从来没有进入演员阵容。