使用空条件布尔?在 if 语句中

Using null-conditional bool? in if statement

此代码有效的原因:

if (list?.Any() == true)

但这段代码没有:

if (list?.Any())

错误 CS0266 无法将类型 'bool?' 隐式转换为 'bool'

那么为什么在 if 语句中进行这种隐式转换不是语言特性?

一个if statement will evaluate a 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))