【问题标题】:Declare Lambda Expression as a class constant field将 Lambda 表达式声明为类常量字段
【发布时间】:2013-10-12 10:39:57
【问题描述】:

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

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

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

【问题讨论】:

  • 您确定我们看到了您的确切代码吗?你在其他地方使用s吗?
  • @JeppeStigNielsen 是的,我确定。 s 不在其他任何地方使用。你没有这个问题吗?你能声明这样一个字段吗?
  • @Alireza:是的,你可以。我只是复制/粘贴了代码,它工作得很好。编辑:除非,你的意思是你想要public LambdaExpression... 而不是public Expression&lt;...
  • 根据您的更新,您不能使用const,您必须使用readonlyconst 要求它是编译时常量;您可以想象在使用MyExpr 的任何地方复制/粘贴的东西。 readonly 将在运行时解析,就像您只是引用一个字段一样。
  • 您可以拥有的Expression&lt;Func&lt;string, bool&gt;&gt; 类型的唯一const 值是null。但是错误消息令人困惑。我还没有尝试自己编译上面的代码。

标签: c# class lambda expression field


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    错误 CS0134:“(字段)”属于“(类型)”类型。引用类型的 const 字段 字符串以外的只能用null初始化。

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

    解决方案是改为创建一个static readonly 字段:

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

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

    【讨论】:

    • 一些C#表达式(我不是在说.NET表达式树表达式<...>)可以清楚地包含一个lambda表达式你能举个例子吗?跨度>
    • @Alireza 表达式filtered = myList.Where(x =&gt; x.Status.IsValid) 确实包含一个 lambda 表达式。
    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多