C#:什么是常量表达式
本文关键字:常量 表达式 什么 | 更新日期: 2023-09-27 18:33:14
我现在正在使用属性。我经常遇到错误"属性参数必须是属性参数类型的常量表达式、类型表达式或数组创建表达式"。我真的不知道"常量表达"是什么意思。
能够将Func<MyType, bool>
传递给属性(由属性存在时执行的代码使用)非常有用。但可惜,没有。我不明白为什么该类型不能放在程序集元数据中,我认为这就是我无法将其传递到属性中的原因。
谁能给我任何想法?
量表达式是仅在编译时确定的值,包括其他常量表达式的字符串串联、算术等。
例如,"是一个常量表达式,但String.Empty
不是。
String
是唯一支持非 null 常量表达式的引用类型。对于值类型,基元类型(int
等)和decimal
支持常量表达式...尽管不能在属性中使用decimal
,因为它不是 CLR 中的基元。(您甚至不能在属性构造函数中将decimal
指定为参数类型。
有关详细信息,请参阅 C# 4 规范的第 7.19 节。
编译器需要能够在编译时创建属性,因为它们与其实际数据一起嵌入到程序集中(它们由编译器实例化并序列化到输出文件中)。这就是为什么你需要一个常量表达式。
基本上你可以使用所有的基本数据类型(如int
、bool
、string
等)。您还可以使用typeof
表达式,因为它们将被解析为标识类型的元数据标记,这在编译时很好。
也许您可以将Func<MyType, bool>
的概念放入类型实现的接口中。或者到一个单独的处理程序类中,您可以使用 typeof(MyHandlerClass)
表达式将其传递给 Attribute。
C#
中的属性是编译时工件,因此为了创建它们,它们必须具有常量类型参数/标记/任何...
我想,有可能尝试做你正在做的事情:
C# 中的动态属性
常量表达式是应完全计算的表达式在编译时。
常量表达式可以是值类型或引用类型。如果常量表达式是值类型,则它必须是以下类型:字节,字节,短,ushort,int,uint,long,ulong,字符、浮点数、双精度、十进制、布尔值或任何枚举类型。如果常量表达式是引用类型,它必须是字符串类型,一个某些引用类型的默认值表达式 (§12.8.20),或表达式的值必须为 null。
源