C# 6.0 if 语句中的空条件运算符

C# 6.0 null-conditional operator in if statements

谁能解释一下 if 语句中空条件运算符的逻辑?

想象一下下面的代码

List<string> items = null;
if (items?.Count == 0)
{
    Console.WriteLine("error");
}
else
{
    Console.WriteLine("OK");
}

上面会打印OK。为什么它在下一个块不会编译时编译?

if (items?.Any())    // won't compile but if (items?.Count() == 0) would
{
    ...
}

我猜是?。当检测到 null 并跳过整个 if 时将停止执行,但为什么“?.Any()”不是这种情况?仅仅因为它是一种方法,而“计数”是 属性?

为什么 Linq 扩展方法 Any() 需要从 Nullable 到 bool 的显式转换,其中 Count() == 0 编译时不需要将 Nullable 转换为 int?

如果 items 为空,则 items?.Count 也为空。
null == 0 是导致错误的比较。所以 if 很高兴。

items?.Any() 也将为 null - 而 if(null) 无效,因为 null 不是布尔值,无法转换为 1。

因此您只需提供一个后备布尔值:

if (items?.Any() ?? false) {

}

会成功的

考虑 null 案例。

if (items?.Count == 0) 中变为 if (null == 0) 并给出 false。

但在if (items?.Any())中变成了if (null),那是无效的。

您可以使用 if (items?.Any() == true)if (items?.Any() ?? false) 或类似的东西。

我注意到 items.Count == 0 是一个错误,但是 items == null returns 在你的第一个例子中没问题。
真奇怪。