【发布时间】:2018-08-14 13:15:42
【问题描述】:
microsoft 的帖子default value expressions (C# programming guide) 解释了default(T) 的用法和行为。行为是(现在仍然是)如下:
var x = default(uint?);
Assert.IsNull(x); // ok
uint? y = default;
Assert.IsNull(y); // ok
然后帖子继续并解释了在 C# 7.1 中引入的 default (default literal and type inference) 的用法和行为。在 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 中的错误还是设计使然?
【问题讨论】:
-
这是 Roslyn 中的一个错误。现在已修复:github.com/dotnet/csharplang/issues/970(基本上你应该将你的 VS2017 安装升级到最新版本。)
-
@DaisyShipton 您能否将其添加为答案以便我接受?我目前正在检查 C# 7.2 是否解决了这个问题(如您发布的链接中所述)并将报告。
-
将 Visual Studio 2017 更新到版本 15.7.6 解决了该问题。无需语言更新。 (它应该已经适用于 15.5+ 版本)
标签: c# default roslyn specifications