将default用作可空值类型参数的默认值不会分配null

时间:2018-08-14 13:15:42

标签: c# default roslyn specifications

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中引入的defaultdefault 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中的错误,还是设计使然?

1 个答案:

答案 0 :(得分:4)

这是一个bug in Roslyn,现已在VS15.5 / .NET Core SDK 2.1.200及更高版本中修复。是的,对于可为空的值类型,默认文字确实应该返回reduce(lambda t, (regex, emoticon): re.sub(regex, emoticon, t), EMOTICON_REGEXPS, text)