Как конвертировать делегат `Func> `в` Func> `? - PullRequest
0 голосов
/ 10 мая 2019

Чтобы мой делегат (с подписью 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>>>? И если да, то как я могу это сделать?

1 Ответ

0 голосов
/ 10 мая 2019

Вы не можете.

Task<TResult> - это задача, результат которой зависит от двух параметров, t1 и t2. Вы видите, что вы не можете преобразовать его в задачу Task<Func<T2, TResult>>, результат которой зависит только от одного параметра t1.

Какая бы асинхронная задача ни выполнялась, требуется (по определению, которое вы дали) эти два параметра заранее, прежде чем она начнет выполняться. Это не может занять t1, тогда, если t2 в более поздний момент, вернуть свой результат синхронно.

...