为什么 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?