你能解释一下,为什么控制台会这样吗.WriteLine写空行(Console.WriteLine(null)给我编译错误)以及为什么没有NullReferenceException(即使a+=1也不应该引发它)?

int? a = null;
a++; // Why there is not NullReferenceException? 
Console.WriteLine(a); // Empty line

推荐答案

你正在观察lifted operator的效果.

根据C#5规范第7.3.7节:

提升运算符允许对不可为空值类型进行操作的预定义运算符和用户定义运算符也可与这些类型的可为空形式一起使用.提升运算符由满足特定要求的预定义和用户定义运算符构造,如下所述:

  • 对于一元运算符+ ++ - -- ! ~ 如果操作数和结果类型都是不可为空值类型,则存在运算符的提升形式.提升的形式是通过向操作数和结果类型添加单个?修饰符来构造的.如果操作数为空,则提升的运算符将生成空值.否则,提升的运算符将展开操作数,应用基础运算符,然后包装结果.

因此,基本上,本例中的a++是一个结果为null的表达式(作为int?),变量保持不变.

当你打电话的时候

Console.WriteLine(a);

它被装箱为object,这会将其转换为空引用,并将其打印为空行.

.net相关问答推荐

DI通过对象的接口而不是实际类型来解析服务

通过 System.Net.Mail 的 VB SMTP 停止工作

如何确定计时器是否正在运行?

string.Format 如何处理空值?

从 switch 块中跳出 foreach 循环

不同命名空间中的部分类

我可以从 .NET/C# 获取其他进程的命令行参数吗?

实例化具有运行时确定类型的对象

如何从字符串中删除所有字母字符?

为什么 WCF 中不允许方法重载?

是否可以更改 Winforms 组合框以禁用输入?

变量MyException已声明但从未使用

何时使用抽象类?

Visual Studio 类图不显示关系

无法加载文件或程序集Antlr3.Runtime (1)或其依赖项之一

C# (.NET) 设计缺陷

通过反射查找可空属性的类型

MailMessage,Sender 和 From 属性的区别

在类型 c# 上切换大小写

为什么 IList 不支持 AddRange