Почему нуль-условный оператор ведет себя по-разному для == и.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);

Теперь компилятор выдает мне ошибку:

Оператор && нельзя применить к операндам типа 'bool' и 'bool?'

Я могу исправить ошибку путем объединения в ложное, как

bool isHref = token.Children().Count() == 1
         && (firstChild?.Name.Equals("href", StringComparison.OrdinalIgnoreCase) ?? false);

Но мне любопытно, почему компилятору не нравится первый нулевой условный синтаксис.

2 ответа

Решение

Упростим до основ.

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() для работы требуется ненулевой объект. Это отличается от ==, которая статически связана, а не отправляется динамически.

Первое выражение возвращает ноль или bool

если firstChild равен нулю, возвращаемое значение будет равно нулю, и его нельзя использовать в условии if

firstChild?.Name.Equals("href", StringComparison.OrdinalIgnoreCase)

будет так же, как

firstChild == null ? null : firstChild.Name.Equals("href", StringComparison.OrdinalIgnoreCase)
Другие вопросы по тегам