Нулевой оператор и оператор 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))
Другие вопросы по тегам