3

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

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

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

4

4 回答 4

9

它与装箱和拆箱有关。它试图从盒子中取出一个 int(拆箱),但该对象为空,因此在它获得要转换的更改之前,您会得到一个空引用异常。

于 2008-12-11T22:43:28.000 回答
8

如果你编译

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

并查看 MSIL 代码,您会看到类似

ldnull
...
unbox.any int32

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

如果 obj 不是装箱类型,则会引发 InvalidCastException。

如果 obj 是空引用,则会引发 NullReferenceException。

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

于 2008-12-11T22:49:32.700 回答
1

它试图在投射之前读取对象。因此,您得到的是空异常而不是强制转换异常。

于 2008-12-11T22:39:26.433 回答
0

例外是选定的值为空的值。它甚至从来没有进入演员阵容。

于 2008-12-11T22:40:49.050 回答