空,条件运算符和if语句
问题描述:
为什么此代码的工作:空,条件运算符和if语句
if (list?.Any() == true)
但是这个代码不:
if (list?.Any())
说错误CS0266无法隐式转换类型'布尔? 'bool'
那么,为什么它不是一个语言功能,如果声明在中做出这样的隐式转换?
答
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))
你是说为什么不'if'声明接受'布尔?'条件?对我而言,如果结果为空,您觉得它很模糊不清。您默认为虚假(有效),但在其他情况下,您希望默认为true。 –
'list?.Any()'如果列表为null,则可能为null。鉴于任何返回布尔它有可能返回一个布尔值。因此在编译时为空的布尔值 – Nkosi
但除此之外,除非Mads或C#设计团队中的其他人员回答,否则基本上会得到猜测。 –