Нулевой оператор и оператор if
Почему этот код работает:
if (list?.Any() == true)
но этот код не:
if (list?.Any())
говоря Ошибка CS0266 не может неявно преобразовать тип 'bool?' к "bool"
Так почему же это не языковая функция, которая делает такое неявное преобразование в операторе if?
1 ответ
Решение
if
заявление оценит Boolean
выражение.
bool someBoolean = true;
if (someBoolean)
{
// Do stuff.
}
Так как if
заявления оценивают Boolean
выражения, что вы пытаетесь сделать, это неявное преобразование из Nullable<bool>
, в bool
,
bool someBoolean;
IEnumerable<int> someList = null;
// Cannot implicity convert type 'bool?' to 'bool'.
someBoolean = someList?.Any();
Nullable<T>
действительно обеспечивает GetValueOrDefault
метод, который можно использовать, чтобы избежать истинного или ложного сравнения. Но я бы сказал, что ваш оригинальный код чище.
if ((list?.Any()).GetValueOrDefault())
Альтернатива, которая может вам понравиться, - это создать собственный метод расширения.
public static bool AnyOrDefault<T>(this IEnumerable<T> source, bool defaultValue)
{
if (source == null)
return defaultValue;
return source.Any();
}
использование
if (list.AnyOrDefault(false))