【问题标题】:Using null-conditional bool? in if statement [duplicate]使用空条件布尔?在 if 语句中[重复]
【发布时间】:2018-01-17 17:06:47
【问题描述】:

为什么这段代码有效:

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

但这段代码没有:

if (list?.Any())

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

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

【问题讨论】:

  • 您的意思是为什么if 语句不接受bool? 条件?如果结果为空,我觉得你想走哪条路是很模糊的。您默认为 false(有效),但在其他情况下您希望默认为 true。
  • list?.Any() 有可能是 null 如果 list 为空。并且鉴于 Any 返回布尔值,它有可能返回布尔值。因此在编译时可以为空的布尔值
  • 但除此之外,除非 Mads 或 C# 设计团队的其他人回答,否则您基本上会得到猜测。
  • if (null == true) 是合法的,但 if (null) 不是。
  • 请注意,如果list 为空,您的最终选项将引发异常。这不好。

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


【解决方案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&lt;T&gt; 确实提供了一个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 不接受bool? 条件?”
  • 所以问题是为什么显式转换可以,而隐式转换不行?这不是关于接受bool? 条件。
  • @Centro 因为如果您尝试强制转换null,显式转换将引发异常。应该不惜一切代价避免隐式转换引发异常,因此我们不能让隐式转换以相同的方式进行。我们也不能将null 隐式转换为false,因为这是不合理的。例如,您可能希望if( !list?.Any() )if( list?Any() ) 相反。但是如果list == null 那么这两个最终都会是if( null )
  • 我还要给defaultValue参数public static bool AnyOrDefault&lt;T&gt;(this IEnumerable&lt;T&gt; source, bool defaultValue = false)添加一个默认值,这样你就可以在没有if (list.AnyOrDefault())之类的参数的情况下调用该方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 2016-11-08
  • 2018-04-17
  • 2013-09-01
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多