微软的post默认值表达式(C#编程指南(解释了default(T)
的用法和行为。行为过去(现在仍然是(如下:
var x = default(uint?);
Assert.IsNull(x); // ok
uint? y = default;
Assert.IsNull(y); // ok
然后,这篇文章继续并解释了 C# 7.1 中引入的default
(默认文字和类型推断(的用法和行为。在 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中的一个错误,现已在VS15.5/.NET Core SDK 2.1.200及更高版本中修复。是的,默认文本确实应该返回可为空值类型的null
。