【发布时间】:2021-05-06 10:15:53
【问题描述】:
谁能解释一下 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 的转换?
【问题讨论】:
-
==上有一个重载来解除比较并且仍然返回真/假,所以魔术就在Nullable<T>上的==运算符中。如果您尝试if (items?.Any() == true),它将编译。 -
请注意,在 C# 9 中,您可以将其写为
if (items is { Count: > 0 })。你可能会也可能不会觉得更清楚。
标签: c# linq null-conditional-operator