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

6

我目前正在处理属性。 我经常遇到错误“属性参数必须是常量表达式、typeof表达式或属性参数类型的数组创建表达式。” 我不太了解“常量表达式”的含义。

如果能够向属性传递Func<MyType,bool>会非常有用(在属性存在时执行代码时使用)。但不幸的是,这不能实现。我不理解为什么该类型无法放置在程序集元数据中,我认为这就是我无法将其传递给属性的原因。

有人可以给我一些想法吗?

4个回答

10

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

例如,"" 是一个常量表达式,但 String.Empty 不是。

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

更多信息请参见 C# 4 规范的第7.19节。


不允许使用 decimal。更多信息请参见:https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0182 - tomwesolowski
@tomwesolowski:已编辑,不过如果您能说明您所指的是什么会更有帮助。 - Jon Skeet
@JonSkeet:谢谢你的回答。太棒了。 - Morteza Azizi

4
编译器需要在编译时创建属性,因为它们带有实际数据嵌入到程序集中(由编译器实例化并序列化到输出文件)。这就是为什么你需要一个常量表达式的原因。基本上你可以使用所有基本数据类型(如int、bool、string等)。你也可以使用typeof表达式,因为它们将被解析为标识类型的元数据令牌,在编译时很好处理。也许你可以将Func<MyType, bool>的概念放入你的类型实现的接口中,或者放入一个单独的处理程序类中,通过使用typeof(MyHandlerClass)表达式传递给你的属性。

这基本上是一个委托,就像我下面建议的那样。 - Styxxy

2

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

可能会有尝试做你要做的事情:

C# 中的动态属性


2
常量表达式是一个在编译时完全评估的表达式。
常量表达式可以是值类型或引用类型。如果常量表达式是值类型,它必须是以下类型之一:sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool或任何枚举类型。如果常量表达式是引用类型,它必须是字符串类型、某个引用类型的默认值表达式(§12.8.20),或者表达式的值必须为null。 来源

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接