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

时间:2008-12-11 22:34:43

标签: c# .net .net-2.0 casting

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

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

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

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:8)

如果你编译

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

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

的内容
ldnull
...
unbox.any int32

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

  

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

     

如果抛出NullReferenceException   obj是一个空引用。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

“选定值”上的异常为空。它甚至都没有进入演员阵容。

豫ICP备18024241号-1