Деревья выражений повторно используют значения? - PullRequest
3 голосов
/ 02 марта 2012

Я читаю книгу Джона Скита. (Глава Деревья Выражений) У него есть пример создания дерева выражений из лямбда-выражений:

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

вопрос:

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

почему я должен указывать ОПЯТЬ в синей части этих параметров?

1 Ответ

5 голосов
/ 02 марта 2012

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

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

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

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

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

(или)

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

Должен ли ваш lambda.Compile()("42", "4") вернуть true или false?

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

...