FirstOrDefault () не могущий связаться с?? оператор

Насколько я могу понять, linq метод FirstOrDefault() возвраты null если официальный набор документов пуст. Почему не может использовать ?? оператор против функции? Как так:

Double d = new Double[]{}.FirstOrDefault() ?? 0.0;


Обновление

Я не хочу проверять если d null позже в моем коде. И выполнение:

Double d new Double[]{}.FirstOrDefault() == null
       ? 0.0 
       : new Double[]{}.FirstOrDefault();

... или:

var r = new Double[]{}.FirstOrDefault();

Double d = r == null ? 0.0 : r;

... кажется небольшим излишеством - я хотел бы сделать эту пустую регистрацию одной строки кода.

6
задан cllpse 13 August 2010 в 11:49
поделиться

5 ответов

Фактически, FirstOrDefault () возвращает T, которое является либо значением, либо значением по умолчанию (T) .

по умолчанию (T) либо null , либо (T) 0 для типов значений (например, double )

11
ответ дан 8 December 2019 в 03:24
поделиться

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

11
ответ дан 8 December 2019 в 03:24
поделиться

Метод называется FirstOrDefault, а не FirstOrNull, т.е. он вернет 0, значение по умолчанию для двойки в любом случае, поэтому нет необходимости в ?

6
ответ дан 8 December 2019 в 03:24
поделиться

Хотя другие ответили, почему у вас здесь проблемы с компиляцией, вы правы, что это проблематично для типов значений. Насколько мне известно, в этом случае невозможно узнать, был ли результат нулевым потому, что первый элемент действительно был нулем, или потому, что IEnumerable был пустым.

В приведенном вами примере резервное значение в любом случае равно нулю, поэтому все, что вам нужно, это:

var r = new double[]{...}.FirstOrDefault();

Предполагая, что у вас было ненулевое резервное значение, у вас есть несколько вариантов:

var r = !myDoubles.Any() ? fallback : myDoubles.First();

или

var r = myDoubles.Cast<double?>().FirstOrDefault() ?? fallback;

Если у вас есть Zen Linq Extensions , вы можете:

var r = myDoubles.FirstOrFallback(fallback);
0
ответ дан 8 December 2019 в 03:24
поделиться

Сделать допускающим значение NULL должно работать. Но затем вы сделаете его допускающим значение NULL , все зависит от вашего сценария ...

Double d = new Double?[] { }.FirstOrDefault() ?? 0.0;
1
ответ дан 8 December 2019 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: