为什么 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()需要一个非空对象来操作。这与 == 不同,它是静态绑定的,而不是动态调度的。