我正在阅读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?
答案 0 :(得分:5)
我认为你的问题是:
为什么不能
Expression.Lambda
检查整个表达式主体 参数表达式,然后使用它们作为表达式参数,让我免除在Lambda
调用中必须再次明确地将它们移交的麻烦?
嗯,当然可以,但在一般情况下,如何通过 order 来接受这些参数呢?
在您的示例中,如何生成表达式等效于:
(x, y) => x.StartsWith(y)
(或)
(y, x) => x.StartsWith(y)?
您的lambda.Compile()("42", "4")
应该返回true
还是false
?
在一般情况下,它不能代表您做出这些决定。