Конечно, вы можете вернуть лямбду из другой лямбды:
Func<int, Func<int, int>> makeAdder = x => y => x + y;
Func<int, int> addTen = makeAdder(10);
Console.WriteLine(addTen(20)); // 30
С каким аспектом синтаксиса у вас возникают проблемы? Мне интересно знать, как люди неправильно понимают подобные вещи, потому что в следующий раз это поможет нам лучше разработать язык и документацию.
UPDATE:
хорошо, но вы не можете вернуть лямбду, возвращая лямбду
Конечно, вы можете.
Func<int, Func<int, int>> GetAdderMaker()
{
return x => y => x + y;
}
Здесь мы возвращаем лямбду, которая возвращает лямбду. Почему вы считаете, что это невозможно?
UPDATE:
Ага, я понимаю. Вы верите, что слово «лямбда» означает «делегат». Это не. Лямбда - это своего рода выражение, которое можно преобразовать в делегат.
Если вам нужен делегат, который возвращает делегата, просто объявите это. Это совершенно законно. Например, вот делегат под названием «комбинатор» - комбинатор - это делегат, который берет себя и возвращает себя:
delegate D D(D d);
Это делегат по имени D, который принимает D и возвращает D.
Вы можете создать лямбда-выражение , совместимое с этим типом делегата . Например:
D I = x=>x;
- комбинатор идентификации. Или
D M = x=>x(x);
- комбинатор пересмешника в причудливой характеристике комбинаторов Раймонда Смулляна.
Как вы правильно заметили, нет никакого способа создать универсальный Func, который является этим типом комбинатора. Я написал статью об этом факте еще в 2006 году:
http://blogs.msdn.com/ericlippert/archive/2006/06/23/standard-generic-delegate-types-part-two.aspx