C# 将Lambda表达式声明为类常量字段

C# 将Lambda表达式声明为类常量字段,c#,class,lambda,expression,field,C#,Class,Lambda,Expression,Field,为什么不能声明类型为Lambda Expression的类常量字段。我想要这样的东西: class MyClass { public const Expression<Func<string,bool>> MyExpr = (string s) => s=="Hello!"; } class-MyClass { 公共常量表达式MyExpr=(字符串s)=>s==“你好!”; } 但是我得到了编译错误:表达式不能包含匿名方法或lambda表达式这只是C#和C

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

class MyClass
{
   public const Expression<Func<string,bool>> MyExpr = (string s) => s=="Hello!";
}
class-MyClass
{
公共常量表达式MyExpr=(字符串s)=>s==“你好!”;
}

但是我得到了编译错误:
表达式不能包含匿名方法或lambda表达式

这只是C#和CLR的一个限制。只有基本数值、字符串文字和
null
可以用作常量字段的值。表达式树表示为对象的普通图形,不能显示为常量值

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

错误CS0134:“(字段)”的类型为“(类型)”。引用类型的常量字段 除字符串外,只能用null初始化

我们确实得到的信息是误导性的。一些C#表达式(我不是说.NET表达式树
表达式
)可以明显包含lambda表达式,但它们没有说明为什么这个特定表达式不能

解决方案是创建一个
静态只读
字段:

class MyClass
{
   public static readonly Expression<Func<string, bool>> MyExpr
     = s => s == "Hello!";
}
class-MyClass
{
公共静态只读表达式MyExpr
=s=>s==“你好!”;
}

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

您确定我们看到了您的确切代码吗?你在别的地方用过
s
吗?@JeppeStigNielsen是的,我肯定。s不在其他任何地方使用。你没有这个问题吗?你能宣布这样一个领域吗?@Alireza:是的,你能。我只是复制/粘贴了代码,效果很好。编辑:除非您的意思是想要
public LambdaExpression…
而不是
public expression基于您的更新,您不能使用
const
,您必须使用
readonly
const
要求它是编译时常量;您可以想象在使用
MyExpr
的任何地方复制/粘贴这些内容
readonly
将在运行时解析,就像您刚刚引用了一个字段一样。您可以拥有的
Expression
类型的唯一
const
值是
null
。但错误信息令人困惑。我自己还没有试过编译上面的代码。一些C#表达式(我不是说.NET表达式树表达式)显然可以包含lambda表达式。请举个例子好吗?@Alireza表达式
filtered=myList。其中(x=>x.Status.IsValid)
确实包含lambda表达式。