【问题标题】:Using default as a default value for a nullable value type parameter does not assign null使用 default 作为可空值类型参数的默认值不会分配 null
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多