将Lambda Expression声明为类常量字段

时间:2013-10-05 12:53:39

标签: c# class lambda expression field

为什么不能声明Lambda Expression类型的类常量字段。我想要这样的东西:

class MyClass
{
   public const Expression<Func<string,bool>> MyExpr = (string s) => s=="Hello!";
}

但是我得到了编译错误:Expression cannot contain anonymous methods or lambda expressions

2 个答案:

答案 0 :(得分:5)

这只是C#和CLR的限制。只有原始数值,字符串文字和null可以用作常量字段的值。表达式树表示为对象的法线图,不能显示为常量值。

答案 1 :(得分:4)

再现。这是来自编译器的奇怪错误消息。我希望相反:

  

错误CS0134:'(field)'的类型为'(type)'。引用类型的const字段   除了字符串之外,只能用null初始化。

我们得到的信息具有误导性。 一些 C#表达式(我不是在谈论.NET表达式树Expression<...>)可以清楚地包含一个lambda表达式,但是他们并没有说为什么这个特殊的表达式不能。

解决方案是改为生成static readonly字段:

class MyClass
{
   public static readonly Expression<Func<string, bool>> MyExpr
     = s => s == "Hello!";
}

只会创建Expression<>的一个实例,但它不是编译时常量,实际上有一些代码会在MyClass首次使用之前运行一次(只是)