【问题标题】:Expression Trees reuse Values?表达式树重用值?
【发布时间】:2012-03-02 17:39:27
【问题描述】:

我正在阅读 Jon Skeet 的书。 (表达式树章节) 它有一个使用 lambda 表达式创建表达式树的示例:

Expression<Func<string, string, bool>> expression =    (x, y) => x.StartsWith(y);
var compiled = expression.Compile();
Console.WriteLine(compiled("First", "Second"));
Console.WriteLine(compiled("First", "Fir"));

现在他正在对表达式树做同样的事情:

问题:

黄色部分已经包含参数信息!

为什么我必须在 blue 部分中指定 AGAIN 那些参数?

【问题讨论】:

    标签: c# .net-4.0 lambda expression-trees


    【解决方案1】:

    我认为你的问题是:

    为什么Expression.Lambda 不能检查整个表达式主体 参数表达式,然后将它们用作表达式参数,从而使我不必在Lambda 调用中显式地再次将它们移交给我吗?

    嗯,它当然可以,但它如何知道在一般情况下以什么顺序 接受这些参数?

    在您的示例中,它如何知道是否生成表达式等价的:

    (x, y) => x.StartsWith(y) 
    

    (或)

    (y, x) => x.StartsWith(y)?
    

    您的lambda.Compile()("42", "4") 应该返回true 还是false

    在一般情况下,它不能代表您做出这些决定。

    【讨论】:

    • 在这一行Expression call = Expression.Call(target, method, methodArgs);我告诉他顺序是什么!第一个是 x ,第二个是方法,第三个是参数!
    • @Royi:这不是顶级 lambda 接受参数的顺序,这就是参数在其中使用的方式特定的子表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多