为什么增量Nullable<int>不抛出异常?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (60)

请你解释一下,为什么Consol.WriteLine写空行(Console.WriteLine(null)告诉我编译错误)以及为什么没有NullReferenceException(甚至a+=1不应该提出)?

int? a = null;
a++; // Why there is not NullReferenceException? 
Console.WriteLine(a); // Empty line
提问于
用户回答回答于

来自C#5规范第7.3.7节:

提升运算符允许对非空值类型操作的预定义运算符和用户定义运算符也与这些类型的可空形式一起使用。提升操作符由符合某些要求的预定义和用户定义操作符构成,如下所述:

  • 一元运算符+ ++ - -- ! ~如果操作数和结果类型都是不可空值类型,则存在运算符的提升形式。通过添加一个?操作数和结果类型的修饰符。如果操作数为空,则提升运算符将产生空值。否则,解除运算符将打开操作数,应用基础运算符,并包装结果。

所以基本上,a++在本例中是一个表达式,其结果是null(作为int?)而变量未被更改。

当你调用

Console.WriteLine(a);

被装进盒子里object,将其转换为空引用,该引用作为空行打印。

用户回答回答于

为什么Console.WriteLine(null)编译错误?

有19个超载Console.WriteLine其中三个适用于null*采取一个string,那个需要一个char[]而采取一个object。C#不能确定这三种中的哪一种,所以它给出了一个错误。Console.WriteLine((object)null)是合法的因为现在很清楚了。

为什么Console.WriteLine(a)写空行?

a为空int?。重载解析选择object方法的版本,因此int?被装箱为空引用。Console.WriteLine((object)null),它会写空行。

为什么没有NullReferenceException增量?

空值在哪里?参照系你在担心什么?a为空int?这不是一个参考类型的开始!记住,可空值类型是价值类型而不是参考类型因此,除非它们被装箱到引用类型,否则不要期望它们具有引用语义。

所属标签

可能回答问题的人

  • EatRice

    16 粉丝0 提问6 回答
  • 华讯云

    0 粉丝0 提问5 回答
  • 学生

    8 粉丝476 提问4 回答
  • 富有想象力的人

    5 粉丝0 提问3 回答

扫码关注云+社区

领取腾讯云代金券