代码之家  ›  专栏  ›  技术社区  ›  Noel Widmer

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

  •  4
  • Noel Widmer  · 技术社区  · 6 年前

    岗位 default value expressions (C# programming guide) 微软解释了 default(T) . 其行为(现在仍然)如下:

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

    文章接着解释了 default default literal and type inference

    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?) 可以简化为 这就导致了这种截然不同的行为。这一定是Visual Studio中的一个bug。

    这也是C#规范/Roslyn中的一个缺陷,还是设计上的缺陷?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Jon Skeet    6 年前

    这是一个 bug in Roslyn 现已在VS15.5/.NET核心SDK 2.1.200及更高版本中修复。是的,默认文本确实应该返回 null