【问题标题】:c#: what is a constant expression?c#:什么是常量表达式?
【发布时间】:2012-05-04 08:52:06
【问题描述】:

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

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

谁能给我一些想法?

【问题讨论】:

    标签: c# custom-attributes constant-expression


    【解决方案1】:

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

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

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这基本上是一个代表,我在下面建议。
    【解决方案3】:

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

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

    Dynamic Attributes in C#

    【讨论】:

    • 感谢您提供非常有趣的链接。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-13
      • 2022-10-08
      • 2011-11-15
      • 2019-06-22
      • 1970-01-01
      • 2020-10-02
      • 2014-08-26
      • 2019-06-22
      相关资源
      最近更新 更多