11

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

例子:

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

让编译器说:

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

为什么?

4

3 回答 3

23

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

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

因此,如果你"Test: " + 123直接通过,它会给出同样的错误。另一方面,如果您更改testValue为字符串,它将编译。


解释

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

因此,"A" + "B"仍然是恒定的。

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

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

于 2013-01-09T19:24:05.470 回答
3

int 和 string 之间的“+”运算符导致调用 int 的 ToString 方法,该方法不是“编译时间常数”。是这样的

private const int x = 3;
private const string s = x.ToString(); // cannot be done
于 2013-01-09T19:26:10.670 回答
0

您只能将编译时评估的常量(包括typeof()运算符的结果和不包括decimals)传递给Attributes 构造函数

于 2013-01-09T19:24:37.273 回答