为什么 null 条件运算符对 == 和 .Equals() 的行为不同?
Why does the null-conditional operator behave differently for == and .Equals()?
我有以下代码,工作正常:
var firstChild = token.First as JProperty;
bool isHref = token.Children().Count() == 1
&& firstChild?.Name == "href";
我想使字符串比较不区分大小写,所以我将其更改为:
var firstChild = token.First as JProperty;
bool isHref = token.Children().Count() == 1
&& firstChild?.Name.Equals("href", StringComparison.OrdinalIgnoreCase);
现在编译器给我一个错误:
Operator && cannot be applied to operands of type 'bool' and 'bool?'
我可以通过像
这样合并为 false 来修复错误
bool isHref = token.Children().Count() == 1
&& (firstChild?.Name.Equals("href", StringComparison.OrdinalIgnoreCase) ?? false);
但我很好奇为什么编译器不喜欢第一个空条件语法。
第一个表达式returns null or bool
如果 firstChild 为 null,则 return 值将为 null,并且不能在 if 条件中使用
firstChild?.Name.Equals("href", StringComparison.OrdinalIgnoreCase)
将与
相同
firstChild == null ? null : firstChild.Name.Equals("href", StringComparison.OrdinalIgnoreCase)
让我们简化到要点。
string x = null, y = null;
// this is null. b1 is bool?
var b1 = x?.Equals(y);
// b2 is bool
// this is true, since the operator doesn't require non-null operands
var b2 = x == y;
基本上.Equals()
需要一个非空对象来操作。这与 ==
不同,它是静态绑定的,而不是动态调度的。
我有以下代码,工作正常:
var firstChild = token.First as JProperty;
bool isHref = token.Children().Count() == 1
&& firstChild?.Name == "href";
我想使字符串比较不区分大小写,所以我将其更改为:
var firstChild = token.First as JProperty;
bool isHref = token.Children().Count() == 1
&& firstChild?.Name.Equals("href", StringComparison.OrdinalIgnoreCase);
现在编译器给我一个错误:
Operator && cannot be applied to operands of type 'bool' and 'bool?'
我可以通过像
这样合并为 false 来修复错误bool isHref = token.Children().Count() == 1
&& (firstChild?.Name.Equals("href", StringComparison.OrdinalIgnoreCase) ?? false);
但我很好奇为什么编译器不喜欢第一个空条件语法。
第一个表达式returns null or bool
如果 firstChild 为 null,则 return 值将为 null,并且不能在 if 条件中使用
firstChild?.Name.Equals("href", StringComparison.OrdinalIgnoreCase)
将与
相同firstChild == null ? null : firstChild.Name.Equals("href", StringComparison.OrdinalIgnoreCase)
让我们简化到要点。
string x = null, y = null;
// this is null. b1 is bool?
var b1 = x?.Equals(y);
// b2 is bool
// this is true, since the operator doesn't require non-null operands
var b2 = x == y;
基本上.Equals()
需要一个非空对象来操作。这与 ==
不同,它是静态绑定的,而不是动态调度的。