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

标签 c# default roslyn specifications

帖子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 中的错误还是设计使然?

最佳答案

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

关于c# - 使用 default 作为可为 null 的值类型参数的默认值不会分配 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51842410/

相关文章:

macos - 我怎样才能让 iTerm 使用 brew 显示的更新版本的 bash?在 OSX 上更改用户的 shell

c# - 如果我支持 VS2015,我的分析器可以针对的最新版本 Roslyn 是什么?

c# - 如何从 XDocument 中获取 NameTable?

c# - HttpClient Head 请求参数始终为 null

python - 将默认 python 更改为另一个版本

c# - 使用 Roslyn 获取方法参数 TYPE 的内部详细信息

c# - 使用 Roslyn 获取 'var' 类型?

C# 创建名称为 <Debug><GivenName> 的文件

c# - 如何使用 @Model (TimeSpan) 在 Razor 中使用三元运算符?

java - 如何从 servlet 打开全新的浏览器