【问题标题】:Why does casting a null to a primitive(ie: int) in .net 2.0 throw a null ref exception and not a invalid cast exception?为什么在 .net 2.0 中将 null 转换为原语(即:int)会引发 null ref 异常而不是无效的转换异常?
【发布时间】:2010-09-26 13:13:44
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么它抛出的异常很重要?只是好奇还是会引起其他问题?

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


【解决方案1】:

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

【讨论】:

  • Quote: "msdn.microsoft.com/en-us/library/b95fkada(v=vs.80).aspx" 尝试拆箱 null 或引用不兼容的值类型将导致 InvalidCastException。
  • @AlexSorokoletov 文档说的很棒,但是当您实际尝试时,每个实际实现都会抛出 NullReferenceException。
  • @JoshuaPech 可能已经过时了,是的
【解决方案2】:

如果你编译

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

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

ldnull
...
unbox.any int32

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

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

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

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

【讨论】:

  • 酷,我从来没有想过反编译它并检查使用的指令。谢谢
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    异常发生在为空的选定值上。它甚至从未进入演员阵容。

    【讨论】:

    • 这不太正确。它在尝试强制转换或特别是取消装箱空引用时抛出。
    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 2012-09-19
    • 2015-08-10
    • 2015-10-29
    • 1970-01-01
    • 2019-05-20
    • 2021-01-04
    • 2022-01-13
    相关资源
    最近更新 更多