你能解释一下,为什么控制台会这样吗.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相关问答推荐

找不到包Microsoft.VisualStudio.Azure.Containers.Tools.Targets

PowerShell 5.1和7在使用证书时的区别

竖线在 PropertyGroup .csproj 文件中的含义

NET 6:控制器方法不可访问

使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

HttpClient 请求抛出 IOException

如何判断 IOException 是否为 Not-Enough-Disk-Space-Exception 类型?

如何在 C# 中创建表达式树来表示String.Contains("term")?

是否可以模拟 .NET HttpWebResponse?

ASP.NET MVC:隐藏字段值不会使用 HtmlHelper.Hidden 呈现

mstest.exe 在哪里?

使用 IIS Express 托管网站(临时)

读取方法的属性值

.net 自定义配置如何不区分大小写解析枚举 ConfigurationProperty

如何对 LINQ to XML 中的元素进行深层复制?

如何防止任务的同步延续?

如何过滤具有多个条件的 Directory.EnumerateFiles?

.NET 配置文件 configSource 在应用程序目录文件夹之外

如何使用通用扩展方法中的字符串列名在 IQueryable 上应用 OrderBy?

可以从 C# 调用 C++ 代码吗?