Используйте константу 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
конструкторы