使用默认值作为可为 null 的值类型参数的默认值不会分配 null



微软的post默认值表达式(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
}

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

这也是 C# 规范/罗斯林中的一个错误还是设计使然?

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

最新更新