Ответ 1
Рассмотрим следующее:
static int M() { Console.Write("M"); return 1; }
static int N() { Console.Write("N"); return 2; }
static int Q(int m, int n) { return m + n; }
...
Func<int> f = ()=>Q(n : N(), m: M());
Expression<Func<int>> x = ()=>Q(n : N(), m: M());
Func<int> fx = x.Compile();
Console.WriteLine(f());
Console.WriteLine(fx());
Вы согласны, я надеюсь, что последние две строки должны делать то же самое, не так ли? Для печати NM3
.
Теперь, какие вызовы библиотеки дерева выражений вам бы хотелось, чтобы преобразование дерева выражений для генерации обеспечило это? Их нет! Поэтому мы сталкиваемся со следующими вариантами:
- Реализация функции в библиотеке дерева выражений. Добавьте преобразование в дерево выражений, понижающее движок, который сохраняет порядок выполнения именованных аргументов. Внедрить код в методе
Compile
, который учитывает порядок выполнения. - Сделать
x = ()=>Q(n : N(), m: M());
фактически реализовано какx = ()=>Q(M(), N());
и несовместимо с версией дерева без выражения. - Запретить именованные аргументы в деревьях выражений. Внесите в это сообщение об ошибке.
(1) приятно, но дорого. (2) является не стартером; мы не можем с чистой совестью представить такую "гочу". (3) дешево, но раздражает.
Мы выбрали (3).