Почему оператор по умолчанию для int? не соответствует? - PullRequest
0 голосов
/ 22 октября 2019

Почему 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; }
}

1 Ответ

1 голос
/ 22 октября 2019

Для простого оператора объявления переменной здесь:

int? a = default;

default всегда является значением по умолчанию типа, которому назначена переменная. Поскольку вы явно объявили, что a имеет тип int?, default будет равен default(int?).

Нулевое слияние (??) типа значения со значением NULL будет пытаться вернутьтип с ненулевым значением (типичная структура, в данном случае int).

Поэтому в этом примере:

a = foo?.Bar ?? default;

default будет равно default(int) какон пытается вернуть объект int через оператор.

И в этом примере:

a = foo?.Bar ?? default(int?);

, поскольку default(int?) возвращает объект типа int?, он либо принудительно применяетлевая рука должна быть приведена к int?, или int? приведена к int. Поскольку int неявно приводится к int?, оператор слияния NULL рассмотрит возвращение int? в этом случае.

...