2012-03-02 3 views
3

Im чтение книги Jon Skeet. (Expression Trees Глава) Это есть пример создания дерева выражений из лямбда-выражений:Значения повторного использования выражений?

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

вопрос:

yellow часть уже содержит информацию о параметрах!

Почему я должен указать СНОВА в синий часть тех парам?

ответ

5

Я думаю, ваш вопрос:

Почему не может Expression.Lambda осмотреть все выражение-тело параметров выражений, а затем использовать их в качестве выражения-параметров, избавляя меня от неприятностей от того, чтобы явно передать их снова в вызове Lambda?

Ну, это, конечно, может, но как бы это знать, в каком заказ принять эти параметры в общем случае?

В вашем примере, как бы это знать, нужно ли генерировать выражение-эквивалент:

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

(или)

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

В случае, если ваш lambda.Compile()("42", "4") возвращение true или false?

Он не может принимать эти решения от вашего имени в общем случае.

+0

в этой строке 'Expression call = Expression.Call (target, method, methodArgs);' Я сказал ему, что это за заказ! первый - это x, второй - метод, а третий - аргумент! –

+0

@Royi: Это не тот порядок, в котором параметры * принимаются * с помощью лямбда верхнего уровня, так как параметры * используются * в этом конкретном подвыражении. – Ani

Смежные вопросы