Что означает "результат не считается постоянным"
В 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);