在属性中使用int constant

时间:2013-01-09 19:19:54

标签: c# const

有人可以解释为什么我不能在C#属性中使用const Int32吗?

示例:

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

使编译器说:

  

“属性参数必须是常量表达式,...”

为什么?

3 个答案:

答案 0 :(得分:19)

如错误所述,属性参数必须是常量表达式。

连接字符串和整数不是常量表达式。

因此,如果直接传递"Test: " + 123,则会产生相同的错误。 另一方面,如果将testValue更改为字符串,则会进行编译。


说明

常量表达式的规则声明常量表达式可以包含算术运算符,前提是两个操作数本身都是常量表达式。

因此,"A" + "B"仍然不变。

但是,"A" + 1使用string operator +(string x, object y);,其中整数操作数被装箱到一个对象。
常量表达式规则明确声明

  

在常量表达式中不允许进行其他转换,包括装箱,取消装箱和非空值的隐式引用转换。

答案 1 :(得分:2)

int和string之间的

'+'运算符会导致调用int的ToString方法,而不是“编译时间常量”。就像这样

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

答案 2 :(得分:0)

您只能传递编译时评估的常量,包括typeof()运算符的结果,并将decimal排除在Attribute的构造函数中