Используйте международную константу в признаке

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

Пример:

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

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

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

Почему?

6
nl ja de
It' s, вероятно, заказ выполнения. Интервал you' определенный ve не будет, вероятно, иллюстрироваться примерами в то время пробеги признака.
добавлено автор Jamie Dixon, источник
@JamieDixon: Неправильно.
добавлено автор SLaks, источник
@AlexanderBalte: На самом деле компилятор может вычислить выражения во время компиляции.
добавлено автор SLaks, источник
Если выражению позволили бы, оно должно быть вычислено в, собирают тип. Поскольку вы знаете, что компилятор C# не поддерживает его.
добавлено автор Alexander Balte, источник

3 ответы

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

Связывание последовательности и целого числа не является константным выражением.

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


Объяснение

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

Поэтому + "B" все еще постоянный.

Однако + 1 использует строковый оператор + (натяните x, возразите y); , в котором операнд целого числа заперт к объекту.
Правила константного выражения явно указывают это

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

18
добавлено
@SLaks хорошие предложения, предполагая, конечно, что признак не запечатанный ...
добавлено автор Ohad Schneider, источник
Хорошие предложения @SLaks, предполагая, конечно, что признак не запечатывается. То, которое является проблемой, потому что запечатывание приписывает, является наиболее успешной практикой (на серьезных основаниях): stackoverflow.com/questions/7868218/…
добавлено автор Ohad Schneider, источник
@Sascha: Правильный, AFAIK. Вы могли сделать свой собственный класс признака, который наследует тот и требования ToString() на его аргументе прежде, чем передать к основу() .
добавлено автор SLaks, источник
Так there' s никакой способ использовать Целые числа в Признаках, которые ожидают последовательность?
добавлено автор Sascha, источник

'+' оператор между интервалом и последовательностью вызывает просьбу метода ToString интервала, который не является "Постоянным временем компиляции". Это похоже на это

private const int x = 3;
private const string s = x.ToString();//cannot be done
2
добавлено
That' s не совсем верный; это на самом деле собирает, чтобы Последовательность. Concat (str, 1)
добавлено автор SLaks, источник

Можно только пройти, время компиляции оценило константы включая результат typeof() операторы и, исключая десятичное число s в Признак s конструкторы

0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot