Ответ 1
РЕДАКТ. Как отмечено в комментариях, это частичное приложение, а не каррирование. Я написал сообщение в своем понимании разницы, которое люди могут найти интересным.
Ну, это не особенно отличается - но я бы выделил часть currying из части "call DoSomething":
public static Func<TResult> Apply<TResult, TArg> (Func<TArg, TResult> func, TArg arg)
{
return () => func(arg);
}
public static Func<TResult> Apply<TResult, TArg1, TArg2> (Func<TArg1, TArg2, TResult> func,
TArg1 arg1, TArg2 arg2)
{
return () => func(arg1, arg2);
}
// etc
Тогда:
DoSomething(Apply(foo, 1));
Таким образом, вы можете повторно использовать код currying в других ситуациях - в том числе случаи, когда вы не хотите сразу же вызвать вновь возвращаемого делегата. (Например, вы можете захотеть сделать это позже).