LambdaExpression 的嵌套调用是否存在错误?

发布于 2024-09-08 01:47:17 字数 1207 浏览 1 评论 0原文

我尝试编译并计算 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;
        }
    }
}

I tried to compile and calculate LambdaExpression like:

Plus(10, Plus(1,2))

But result is 4, not 13.

Code:

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;
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

信仰 2024-09-15 01:47:17

由于似乎没有人发布此内容:

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

Since nobody seems to be posting this:

It looks to be a bug in .NET 3.5, and is fixed in .NET 4.

画离情绘悲伤 2024-09-15 01:47:17

而这似乎在 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);

whereas this seems to produce 13 in 3.5 too:

     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);
日记撕了你也走了 2024-09-15 01:47:17

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

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

maybe i needs to assign the result to a local var
try this

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文