为什么default
返回不同的值?是否因为空合并运算符?
代码(FYI .Dump()来自LinqPad):
void Main()
{
Foo foo = null;
int? a = default;
a.Dump("a"); // returns null
a = foo?.Bar ?? default;
a.Dump("a"); // returns 0
a = foo?.Bar ?? default(int?);
a.Dump("a"); // returns null
(foo?.Bar is null ? default : "ADsf").Dump();
}
class Foo
{
public int? Bar { get; set; }
}
对于这里的简单变量声明语句:
int? a = default;
default
始终是变量分配类型的默认值。由于您已明确声明a
具有int?
的类型,因此default
将等于default(int?)
。
可为空的值类型的空合并(??
)将尝试返回非空值类型(您的典型结构,在这种情况下为int
)。
因此在此示例中:
a = foo?.Bar ?? default;
[default
将等于default(int)
,因为它试图通过运算符返回int
对象。
在此示例中:
a = foo?.Bar ?? default(int?);
因为default(int?)
返回类型为int?
的对象,它将强制将左手强制转换为int?
,或者将int?
强制强制转换为int
。由于int
被隐式转换为int?
,因此在这种情况下,空合并运算符将考虑返回int?
。