为什么 int 的默认运算符?不一致?
Why default operator for int? is not consistent?
为什么 default
返回不同的值?是因为空合并运算符吗?
代码(仅供参考 .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?)
.
可空值类型的空合并 (??
) 将尝试 return 非空值类型(您的典型结构,在本例中为 int
)。
因此在这个例子中:
a = foo?.Bar ?? default;
default
将等于 default(int)
,因为它试图通过运算符 return 一个 int
对象。
在这个例子中:
a = foo?.Bar ?? default(int?);
由于 default(int?)
return 是类型 int?
的对象,它将强制将左手转换为 int?
,或者 int?
转换为 int
。由于 int
被隐式转换为 int?
,空合并运算符将在这种情况下考虑 returning int?
。
为什么 default
返回不同的值?是因为空合并运算符吗?
代码(仅供参考 .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?)
.
可空值类型的空合并 (??
) 将尝试 return 非空值类型(您的典型结构,在本例中为 int
)。
因此在这个例子中:
a = foo?.Bar ?? default;
default
将等于 default(int)
,因为它试图通过运算符 return 一个 int
对象。
在这个例子中:
a = foo?.Bar ?? default(int?);
由于 default(int?)
return 是类型 int?
的对象,它将强制将左手转换为 int?
,或者 int?
转换为 int
。由于 int
被隐式转换为 int?
,空合并运算符将在这种情况下考虑 returning int?
。