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

c#

有人可以解释一下 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()”不是这种情况?仅仅因为它是一种方法而“count”是一种属性?

为什么 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),那给假。

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

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

我注意到这items.Count == 0是一个错误,但items == null在您的第一个示例中返回 Ok。
这很奇怪。


以上是C#6.0if语句中的空条件运算符的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>