Используйте константу int в атрибуте

Кто-нибудь может объяснить, почему я не могу использовать const Int32 в атрибуте C#?

Пример:

private const Int32 testValue = 123;  
[Description("Test: " + testValue)]  
public string Test { get; set; }

Заставляет компилятор сказать:

"Аргумент атрибута должен быть константным выражением, ..."

Зачем?

3 ответа

Решение

Как говорится в ошибке, аргумент атрибута должен быть константным выражением.

Конкатенация строки и целого числа не является константным выражением.

Таким образом, если вы пройдете "Test: " + 123 напрямую, это даст ту же ошибку. С другой стороны, если вы измените testValue в строку, он будет скомпилирован.


объяснение

Правила для константных выражений гласят, что константное выражение может содержать арифметические операторы при условии, что оба операнда сами являются константными выражениями.

Следовательно, "A" + "B" все еще постоянен.

Тем не мение, "A" + 1 использует string operator +(string x, object y);, в котором целочисленный операнд упакован в объект.
Правила константных выражений прямо заявляют, что

Другие преобразования, включая бокс, распаковку и неявные ссылочные преобразования ненулевых значений, не допускаются в константных выражениях.

Оператор '+' между int и строкой вызывает метод ToString объекта int, который не является "постоянной времени компиляции". Это так

private const int x = 3;
private const string s = x.ToString(); // cannot be done

Вы можете передавать только константы, вычисленные во время компиляции, включая результат typeof() операторы и исключая decimalс в Attributeконструкторы

Другие вопросы по тегам