【问题标题】:Use int constant in attribute在属性中使用 int 常量
【发布时间】:2013-01-09 19:19:54
【问题描述】:

谁能解释为什么我不能在 C# 属性中使用 const Int32?

例子:

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

让编译器说:

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

为什么?

【问题讨论】:

  • 大概是执行顺序吧。您定义的 int 在属性运行时可能不会被实例化。
  • 如果允许表达式,它应该在编译类型时计算。如您所知,C# 编译器不支持它。
  • @AlexanderBalte:实际上,编译器可以在编译时计算表达式。

标签: c# constants


【解决方案1】:

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

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

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


说明

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

因此,"A" + "B" 仍然是常数。

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

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

【讨论】:

  • 所以没有办法在需要字符串的属性中使用整数?
  • @Sascha:正确,AFAIK。您可以创建自己的属性类来继承该属性类并在传递给base() 之前在其参数上调用ToString()
  • @SLaks 好建议,当然假设属性不是sealed...
  • @SLaks 很好的建议,当然假设该属性没有密封。这是一个问题,因为密封属性是最佳实践(有充分的理由):stackoverflow.com/questions/7868218/…
【解决方案2】:
int 和 string 之间的

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

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

【讨论】:

  • 这不太对;它实际上编译为String.Concat(str, 1)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多