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 在你的第一个例子中没问题。
真奇怪。
谁能解释一下 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 在你的第一个例子中没问题。
真奇怪。