Что означает "результат не считается постоянным"

В MSDN я нашел это предложение:

Результат Оператор не считается константой, даже если оба его аргумента являются константами.

Что это значит? Они означают, что оптимизатор компилятора не знает, что это значение является постоянным? Я не вижу другого способа, которым это могло бы иметь отношение.

Редактировать: И почему это не считается постоянным? Есть ли логическая причина для этого?

Изменить: этот кусок кода дает ошибку компилятора для х, но не для у, почему можно ?: привести к постоянному значению, но ?? не могу?

const string NULL = null;
const string val = "value";
const string x = NULL ?? val;
const string y = NULL == null ? val : NULL;

3 ответа

Решение

Давайте подумаем об использовании?? оператор в константных выражениях. Возможно ли это в принципе? Конечно, потому что у нас есть вся необходимая информация во время компиляции. Это реализовано в C#? Нету. Зачем? Потому что команда компилятора C# решила не реализовывать эту функцию. Вот что говорит Эрик Липперт о выборе функций, которые должны быть реализованы:

Функции должны быть настолько привлекательными, что они стоят огромных долларовых затрат на разработку, внедрение, тестирование, документирование и доставку этой функции. Они должны стоить затрат на усложнение языка и усложнение разработки других функций в будущем.

Когда мы можем использовать?? оператор в постоянном выражении? Когда expr-first является нулевым литералом. А тип константы - это либо объект, либо строка (помните, команда C# уже решила не добавлять поддержку констант Nullables). А что эта функция добавит к языку?

const string s = null ?? "foo";

Это не добавляет никакого удобства языку. Это абсолютно так же, как

const string s = "foo";

но сложнее.

Это означает, что вы не можете использовать оператор слияния нулей в константе:

public const int MyInt = 42; // Fine
public const int MyOtherInt = new int?(42) ?? 8; // Compiler error

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

public const int SomeResult = 12 + 42; // Fine
public const int OtherResult = SomeResult * 2; // Fine

Это на самом деле не вопрос "оптимизации" - на самом деле, ?? Оператор оптимизирован довольно сильно в большинстве сценариев:

var someValue = new int?(42) ?? 8; // Produces ldc.i4.8

Если вы напишите код, который может вызвать это сообщение об ошибке, ответ будет очевидным.

public void Test()
{
    const int x = ((int?)null ?? 3);
}

Это приводит к следующей ошибке:

Ошибка 9 Выражение, присваиваемое 'x', должно быть постоянным

Таким образом, компилятор не вычисляет результат ?? во время компиляции.

В отличие от многих других операторов, таких как ? : рассчитываются во время компиляции, поэтому следующее не генерирует ошибку:

const int x = (true ? 3 : 2);
Другие вопросы по тегам