Может кто-нибудь объяснить логику условного оператора null в операторах if?
Представьте себе следующий код
List<string> items = null;
if (items?.Count == 0)
{
Console.WriteLine("error");
}
else
{
Console.WriteLine("OK");
}
Приведенное выше будет печатать OK. Почему он компилируется, если следующий блок не компилируется?
if (items?.Any()) // won't compile but if (items?.Count() == 0) would
{
...
}
Я угадываю ?. остановит выполнение при обнаружении нуля и пропустит весь if, но почему это не так с ?.Any()? Просто потому, что это метод, а count — свойство?
И почему метод расширения Linq Any() требует явного преобразования из Nullable в bool, где Count() == 0 компилируется без преобразования Nullable в int?
==
, чтобы отменить сравнение и по-прежнему возвращать true/false, поэтому магия заключается в операторе==
дляNullable<T>
. Если вы попробуетеif (items?.Any() == true)
, он скомпилируется. - person Lasse V. Karlsen   schedule 06.05.2021if (items is { Count: > 0 })
. Вы можете или не можете найти это яснее. - person canton7   schedule 06.05.2021