Когда текст равен null, текст?.IndexOf (ch)!= -1 верно?

наблюдение: если текст null этот метод возвращает правда. Я ожидал False.

return text?.IndexOf('A') != -1;

когда я отражаю вышеуказанную строку с помощью ILSpy (или проверяю IL), это сгенерированный код:

return text == null || text.IndexOf('A') != -1;

вот что мне действительно нужно, чтобы удовлетворить мои ожидания:

return text != null && text.IndexOf('A') != -1;

вопрос: у кого-то есть хорошее объяснение, почему нулевой условный код сгенерировал или выражение?

полный образец на:https://dotnetfiddle.net/T1iI1c

1 ответов


строка выше действительно включает в себя две операции: вызов метода оператора null-conditional и сравнение. Что произойдет, если вы сохраните результат первого оператора как промежуточную переменную?

int? intermediate = text?.IndexOf('A');
return intermediate != -1;

очевидно, что если text null тогда intermediate также будет null. Сравнивая это с любой целое значение с помощью != вернутся true.

из MSDN (выделено мной):

при выполнении сравнение с типами с нулевыми значениями, если значение одного из типов с нулевыми значениями равно null, а другого нет, все сравнения оцениваются как false исключением != (не равно).

код can записывается с помощью оператора null-conditional, если вы можете использовать другой оператор для обеспечения сравнения с null, равным false. В этом случае

return text?.IndexOf('A') > -1;

вернет результат, который вы ожидали.