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

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

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

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

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

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

也许你可以把你的Func的概念放到你的类型实现的接口中。 或者进入一个单独的处理程序类,您可以使用typeof(MyHandlerClass)表达式将其传递给Attribute。

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

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

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

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

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

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

C#中的动态属性

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

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