【问题标题】:difference between delegates and variables in expression trees表达式树中委托和变量之间的区别
【发布时间】:2016-12-30 16:03:41
【问题描述】:

我正在尝试查看是否了解表达式树并可以生成其他一些受支持的运算符。我不明白为什么我不能将 plusEqual 文字用作函数并将值传递给它。当我取下 cmets 时,我收到一条错误消息。错误说“需要方法名称”。我对这段代码的理解是 plusEquals 是一个变量,它指向一个可执行代码。我确实看到我可能正在回答部分问题,但我的问题是为什么会发生这种情况,并且这与我在一些教程网站(例如 Exprssion Tree basics)中看到的相反。这里查理有 `int c = function(3, 5); 我正在按照下面的代码中创建 plusEquals 的确切步骤进行操作。如您所见,一旦我 compile() 表达式,我就会得到我想要的结果。 这是我的代码:

using System;
using System.Linq.Expressions;
namespace myExpressionTree
{
    class Program
    {
        static void Main(string[] args)
        {

            Expression<Func<int, int, int>> expression = (a, b) => a + b;

            Console.WriteLine(expression);
            Expression<Func<int, bool>> lessThan = i => i < 5;
            Console.WriteLine(lessThan);
            Console.WriteLine("result of expression of i < 5 = {0}", lessThan);
            Expression<Func<int, int>> plusEquals = a =>  +a;
            Console.WriteLine(plusEquals);
            //Int32 c = plusEquals(3);
            int c = plusEquals.Compile()(3);
            Console.WriteLine("Here is result of plusEquals expression on c {0}",c);
            Console.ReadLine();
        }
    }

}

` 另一个有趣的点或相当不同的是,在 ExpressionVisualizer 中显示的 plusEquals 节点类型是 lambda,而不是它们的类成员名称,例如 Add、lessThan 和 Expression 中的其他名称。

更新;好的,知道了,谢谢。我遇到的一个突出问题是 add 表达式的节点类型如何在 ExpressionVisualizer 中显示为 Add 但 lessThan 和 += 运算符节点类型被标记为 lambda?

【问题讨论】:

  • 在您的链接中,function 被定义为Func&lt;int, int, int&gt; function = (a,b) =&gt; a + b;,而不是Expression&lt;Func&lt;int, int, int&gt;&gt; function = (a,b) =&gt; a + b;
  • 在你引用的查理的例子中,函数是一个 lambda,而不是一个表达式树。 lambda 是可执行代码,表达式树不是。
  • @maverick a =&gt; +a 将返回其参数,不变。一元 + 是无操作的。 +1 == 1。+2 == 2。+x == x。
  • 谢谢。我把它改成了 a => a+a;一切都很好。
  • @EdPlunkett +'A'.

标签: c# expression-trees


【解决方案1】:

Expression 只是代码结构的表示,要执行Expression,您总是必须先编译它。

查看您在问题中发布的link 中的Compiling an Expression: Converting Data back into Code 部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 2011-01-14
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    相关资源
    最近更新 更多