嵌套调用LambdaExpression有错误吗?

时间:2010-07-05 08:43:41

标签: c# lambda

我尝试编译并计算LambdaExpression,如:

  

加号(10,加号(1,2))

但结果是4,而不是13。

代码:

using System;
using System.Linq.Expressions;

namespace CheckLambdaExpressionBug
{
    class Program
    {
        static void Main(string[] _args)
        {
            ParameterExpression p1 = Expression.Parameter(typeof (int), "p1");
            ParameterExpression p2 = Expression.Parameter(typeof (int), "p2");
            LambdaExpression lambda = Expression.Lambda(Expression.Call(typeof(Program).GetMethod("Plus"), p1, p2), p1, p2);

            InvocationExpression exp1 = Expression.Invoke(
                lambda,
                Expression.Constant(1),
                Expression.Constant(2)
                );

            InvocationExpression exp2 = Expression.Invoke(
                lambda,
                Expression.Constant(10),
                exp1
                );

            var func = (Func<int>) Expression.Lambda(exp2).Compile();

            int v = func();
            Console.Out.WriteLine("Result = {0}", v);
        }

        public static int Plus(int a, int b)
        {
            return a + b;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

因为似乎没有人发布这个:

它看起来是.NET 3.5中的一个错误,并在.NET 4中得到修复。

答案 1 :(得分:0)

虽然这似乎也在3.5中产生13:

     var plus = new Func<int, int, int>((a, b) => a + b);
     var func = new Func<int>(() => plus(10, plus(1, 2)));
     var res = func();
     Console.WriteLine(res);

答案 2 :(得分:0)

也许我需要将结果分配给本地var 试试这个

var plus = new Func((a,b)=&gt; a + b); var puls_1 = plus(1,2); var func = new Func(()=&gt; plus(10,plus_1)); var res = func(); Console.WriteLine(RES);