Почему null == false не приводит к ошибке компиляции в С#? - программирование
Подтвердить что ты не робот

Почему null == false не приводит к ошибке компиляции в С#?

Это не решение какой-либо конкретной проблемы. Просто вопрос компилятора.

Почему следующий код не приводит к ошибке компиляции? Он сравнивает ссылочный тип с примитивным типом. И нуль, и ложь должны интерпретироваться во что-то для компилятора, чтобы делать сравнение. Или синтаксический анализатор просто сканирует такой шаблон и заменяет его на false?

if(null == false) { }
4b9b3361

Ответ 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, а не ошибкой компилятора.