为什么不能声明Lambda Expression
类型的类常量字段。我想要这样的东西:
class MyClass
{
public const Expression<Func<string,bool>> MyExpr = (string s) => s=="Hello!";
}
但是我得到了编译错误:Expression cannot contain anonymous methods or lambda expressions
答案 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
首次使用之前运行一次(只是)