6

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

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

谁能给我任何想法?

4

4 回答 4

9

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

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

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

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

于 2012-05-04T08:55:40.183 回答
4

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

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

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

于 2012-05-04T08:58:48.457 回答
2

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

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

C# 中的动态属性

于 2012-05-04T08:54:29.607 回答
2

常量表达式是可以在编译时完全计算的表达式。

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

于 2012-05-04T08:55:25.097 回答