Чтобы мой делегат (с подписью Func<T1, Func<T2, Task<TResult>>
) был применим, он должен подтвердить подпись Func<T1, Task<TResult>>
. Я хотел бы иметь такую функцию, как:
public static Func<T1, Task<Func<T2, TResult>> TaskToOuterScope<T1, T2, TResult>(Func<T1, Func<T2, Task<TResult>>> f)
{
// throw new NotImplementedException();
}
Как реализовать эту TaskToOuterScope
-функцию?
Я пытался:
public static Func<T1, Task<Func<T2, TResult>> TaskToOuterScope<T1, T2, TResult>(Func<T1, Func<T2, Task<TResult>>> f)
{
return async (T1 arg1) => await (async (T2 arg2) => await f(arg1)(arg2));
}
Однако это приводит к тому, что CS4001 не может ожидать «лямбда-выражения».
Google дал страницы, посвященные либо каррированию (подпись Func<T1, Func<T2, Task<TResult>>
- результат карри), либо асинхронному / ожиданию, но не о комбинации или, более конкретно, о перемещении задачи во внешнюю область в функциях более высокого порядка.
Возможно ли преобразование из Func<T1, Func<T2, Task<TResult>>
в Func<T1, Task<Func<T2, TResult>>>
?
И если да, то как я могу это сделать?