空条件运算符和if语句

时间:2017-08-09 17:18:07

标签: c# c#-6.0 null-conditional-operator

为什么此代码有效:

TOP

但是这段代码没有:

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

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

那么为什么它不是在 if 语句中进行这种隐式转换的语言功能呢?

1 个答案:

答案 0 :(得分:2)

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))