代表和表达式树中的变量之间的差异

时间:2016-12-30 16:03:41

标签: c# expression-trees

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

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而不是它们的类成员名称,例如Expression,LessThan和Expression中的其他名称。 enter image description here

更新;好的,谢谢你。我遇到的一个突出问题是,如果add表达式的nodetype在ExpressionVisualizer中显示为Add,那么lessThan和+ =运算符nodetypes会被标记为lambda? Add Expression

1 个答案:

答案 0 :(得分:1)

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

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