c#:什么是常量表达式?

时间:2012-05-04 08:52:07

标签: c# custom-attributes constant-expression

我目前正在使用属性。我经常遇到错误'属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式。我真的不知道“常数表达”是什么意思。

能够将Func<MyType, bool>传递给属性(由属性存在时执行的代码使用)将非常有用。但是,唉,没有。我不明白为什么不能将这种类型放在汇编元数据中,我认为这是我无法将其传递给属性的原因。

任何人都可以给我任何想法吗?

4 个答案:

答案 0 :(得分:8)

常量表达式是仅在编译时确定的值,包括其他常量表达式的字符串连接,算术等。

因此,例如“”是一个常量表达式,但String.Empty不是。

String是唯一支持非null常量表达式的引用类型。对于值类型,基元类型(int等)和decimal支持常量表达式...虽然您不能在属性中使用decimal,因为它不是CLR中的基元。 (您甚至无法在属性构造函数中将decimal指定为参数类型。)

有关详细信息,请参阅C#4规范的第7.19节。

答案 1 :(得分:3)

编译器需要能够在编译时创建属性,因为它们使用实际数据嵌入到程序集中(它们由编译器实例化并序列化到输出文件中)。这就是你需要一个常量表达式的原因。

基本上,您可以使用所有基本数据类型(例如intboolstring等。您还可以使用typeof表达式,因为它们将被解析为标识类型的元数据标记,这在编译时很好。

也许您可以将Func<MyType, bool>的概念放入您的类型实现的界面中。或者进入一个单独的处理程序类,您可以使用typeof(MyHandlerClass)表达式将其传递给您的属性。

答案 2 :(得分:2)

C#中的属性是编译时间工件,因此为了创建它们,它们必须具有常量类型参数/ markers / whatever ...

我认为,有可能尝试做你想做的事情:

Dynamic Attributes in C#

答案 3 :(得分:2)

  

constant-expression是一个可以在编译时完全评估的表达式。

http://msdn.microsoft.com/en-us/library/aa691319(v=vs.71).aspx(旧文章但仍有效)