表达式树重用值?

时间:2012-03-02 17:39:28

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

我正在阅读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"));

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

enter image description here

问题:

黄色部分包含参数信息!

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

1 个答案:

答案 0 :(得分:5)

我认为你的问题是:

  

为什么不能Expression.Lambda检查整个表达式主体   参数表达式,然后使用它们作为表达式参数,让我免除在Lambda调用中必须再次明确地将它们移交的麻烦?

嗯,当然可以,但在一般情况下,如何通过 order 来接受这些参数呢?

在您的示例中,如何生成表达式等效于:

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

(或)

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

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

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