2017-08-09 155 views
-1

为什么此代码的工作:空,条件运算符和if语句

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

但是这个代码不:

if (list?.Any()) 

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

那么,为什么它不是一个语言功能,如果声明在中做出这样的隐式转换?

+2

你是说为什么不'if'声明接受'布尔?'条件?对我而言,如果结果为空,您觉得它很模糊不清。您默认为虚假(有效),但在其他情况下,您希望默认为true。 –

+0

'list?.Any()'如果列表为null,则可能为null。鉴于任何返回布尔它有可能返回一个布尔值。因此在编译时为空的布尔值 – Nkosi

+0

但除此之外,除非Mads或C#设计团队中的其他人员回答,否则基本上会得到猜测。 –

回答

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

我将问题解释为“为什么不'如果'接受'布尔?'的条件?” –

+0

所以问题是为什么明确的转换是好的,但隐含的转换没有?这不是关于接受'bool?'条件。 – Centro

+0

@Centro因为如果你尝试转换'null',显式转换会抛出一个异常。应该不惜一切代价避免抛出异常的隐式转换,所以我们不能让隐式转换以同样的方式进行。我们也不能将'null'隐式转换为'false',因为这是不合理的。例如,你可能希望'if(!list?.Any())'与if(list?Any())'相反。但是,如果'list == null',那么这两者最终都是'if(null)'。 – Kyle