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中的错误,还是设计使然?
答案 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)
。