使用空条件布尔?在 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))
此代码有效的原因:
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))