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