12

为什么此代码有效:

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

但这段代码没有:

if (list?.Any())

错误 CS0266 无法隐式转换类型“bool?” '布尔'

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

4

1 回答 1

7

语句将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))
于 2017-08-09T17:23:03.470 回答