首页 > 解决方案 > 使用 default 作为可空值类型参数的默认值不会分配 null

问题描述

microsoft的后默认值表达式(C# 编程指南)default(T)解释了. 行为是(现在仍然是)如下:

var x = default(uint?);
Assert.IsNull(x); // ok

uint? y = default;
Assert.IsNull(y); // ok

然后这篇文章继续解释C# 7.1 中引入的default默认文字和类型推断)的用法和行为。在 C# 7.1 之前,我们做了:

void BeforeCsharp7_1(uint? z = default(uint?))
{
   Assert.IsNull(z); // ok
}

使用 C# 7.1,我们可以:

void WithCsharp7_1(uint? z = default)
{
   Assert.IsNull(z); // Fail, expected null but was 0
}

您可能会惊讶地看到最后一个片段不会断言,因为参数zequals 0。将我的项目升级到 C# 7.1 后,Visual Studio 一直告诉我default(uint?)可以简化为default这会导致这种非常不同的行为。这一定是 Visual Studio 中的错误。

这也是 C# Specification / Roslyn 中的错误还是设计使然?

标签: c#defaultroslynspecifications

解决方案


这是Roslyn 中的一个错误,现已在 VS15.5 / .NET Core SDK 2.1.200 及更高版本中修复。是的,默认文字确实应该null为可空值类型返回。


推荐阅读