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。
这很奇怪。