Почему null == false не приводит к ошибке компиляции в С#?
Это не решение какой-либо конкретной проблемы. Просто вопрос компилятора.
Почему следующий код не приводит к ошибке компиляции? Он сравнивает ссылочный тип с примитивным типом. И нуль, и ложь должны интерпретироваться во что-то для компилятора, чтобы делать сравнение. Или синтаксический анализатор просто сканирует такой шаблон и заменяет его на false?
if(null == false) { }
Ответы
Ответ 1
Это законно, потому что используется оператор с поднятым сравнением. Если вы сравниваете bool
с a null
, то как bool
и null
получают неявно преобразованные в Nullable<bool>
, а оператор сравнения для Nullable<bool>
заканчивается. Вы получаете предупреждение, потому что, очевидно, оно всегда неверно.
Ответ 2
Ответ Tejas правильный. Чтобы более конкретно рассмотреть некоторые из ваших вопросов:
Почему следующий код не приводит к ошибке компиляции?
Вопрос не отвечает; это не вызывает ошибки, потому что это легальный код, но это тавтология.
Если ваш вопрос на самом деле "какой раздел спецификации С# делает это законным?", то это ответный вопрос. Раздел о снятых операторах равенства делает его законным.
Он сравнивает ссылочный тип с примитивным типом.
Это не так. Во-первых, избегайте термина "примитивный тип"; спецификация не четко определяет его, и это не является полезной концепцией на С#. Вы хотели сказать, что я думаю, что он сравнивает значение ссылочного типа со значением типа значения.
Во-вторых, это тоже не правильно. Нулевой литерал не имеет ссылочного типа или типа значения; он не имеет никакого типа. Он конвертируется в любой тип значения NULL или любой ссылочный тип, но сам по себе он не имеет типа.
В этом случае нулевой литерал преобразуется в нулевой тип bool.
Оба значения null и false должны интерпретироваться в компиляторе для сравнения.
Правильно. Они интерпретируются как обнуляемые bools.
- синтаксический анализатор просто сканирует такой шаблон и заменяет его на false?
Нет, но это отличная догадка. Компилятор будет с постоянной скоростью, скажем, true == false
до false
, но не выполняет оптимизацию сгибания, которая включает типы значений с нулевым значением. Язык может быть изменен для поддержки постоянной фальцовки операций с операндами типа NULL. были с нулевыми значениями, которые были встречно встречены в первой версии, предположительная функция, вероятно, была бы поддержана.
Ответ 3
В разделе 7.10.6 спецификации языка (операторы равенства ссылочного типа) указано:
Конструкция x == null
разрешена, даже если T может представлять тип значения, и результат просто определяется как false, когда T является типом значения.
Это условие требует, чтобы null == false
был false
, а не ошибкой компилятора.