Почему условный оператор .NET null не возвращает false при попытке проверить, есть ли в коллекции какие-либо элементы?

Я пытаюсь сделать следующую проверку:

if (result?.Pets?.Any() == false) { ... }

а если result == null .. то это не входит в рамки этой if проверки.

Я думал, что result?. (в этом случае) вернется null .. так это то, что пытается сделать:

if (null == false) { ... } // result == null

а если так.. то что? Моя первая мысль была примерно такой:

if (result?.Pets?.Any() == false ?? false) { .. } 

но это ошибка компилятора :(

оценить с помощью result?.Pets?.Any() != true для нулевого или пустого значения.

lidqy 17.05.2022 15:19

Если result равно null или result.Pets равно null, то result?.Pets?.Any() будет оцениваться как null. null == false будет оцениваться как false, потому что null и false не являются одним и тем же значением.

DiplomacyNotWar 17.05.2022 15:21
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

null не равно false, а null не равно true. Простой способ исправить это — проверить, является ли результат ?.Any()неtrue (то есть nullилиfalse).

if (result?.Pets?.Any() != true) { ... }

Это также показатель того, что вы должны проверять значение null и обрабатывать этот случай отдельно.

Kieran Devlin 17.05.2022 15:22

Да, но это зависит. Иногда вы хотите, чтобы та же логика выполнялась, если у вас есть нулевой или, у вас нет результатов.

gunr2171 17.05.2022 15:23
Ответ принят как подходящий

Как объясняли другие, null не равно false. Использование оператора объединения с нулевым значением ??, чтобы обойти это, должно работать, но ваш синтаксис неверен. Правильный синтаксис будет примерно таким:

if ((result?.Pets?.Any() ?? false) == false) { ... }

Однако для удобочитаемости я бы сделал что-то вроде этого:

bool petsFound = result?.Pets?.Any() ?? false;
if (!petsFound) { ... }

В качестве альтернативы вы можете сделать это старым добрым способом, используя проверку на ноль и оператор короткого замыкания ||:

if (result?.Pets is null || !result.Pets.Any()) { ... }

Привет и здорово. Мне очень нравится второе решение еще и потому, что я большой поклонник удобочитаемости (поддержка/обслуживание приложения и т. д.). Так что это тоже хорошо работает. Здоровья, приятель!

Pure.Krome 17.05.2022 15:31

Другие вопросы по теме