2

有人可以解释一下 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 的转换?

4

2 回答 2

8

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

items?.Any()也将为 null - 并且if(null)无效,因为 null 不是布尔值,并且不能转换为一个。

所以你只需要提供一个备用布尔值:

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

}

会成功的

于 2021-05-06T10:19:16.873 回答
5

考虑null案例。

if (items?.Count == 0) 那成为if (null == 0),那给了假。

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

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

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

于 2021-05-06T10:22:16.210 回答