繁体   English   中英

如何转换委托`Func <T1, Func<T2, Task<TResult> &gt;&gt;`到`Func <T1, Task<Func<T2, TResult> &gt;`?

[英]How to convert delegate `Func<T1, Func<T2, Task<TResult>>>` to `Func<T1, Task<Func<T2, TResult>>`?

对于我的代理(具有签名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无法等待'lambda表达式'。

谷歌搜索提供了关于currying的页面(签名Func<T1, Func<T2, Task<TResult>>是currying的结果)或关于async / await但不关于组合或更具体地关于将任务移动到外部范围的页面高阶函数。

Func<T1, Func<T2, Task<TResult>>Func<T1, Task<Func<T2, TResult>>>转换是否可能? 如果是这样,我该怎么办呢?

你不能。

Task<TResult>是一项任务,其结果取决于两个参数t1t2 您可以看到您无法将其转换为任务Task<Func<T2, TResult>>其结果仅取决于一个参数t1

无论正在执行什么异步任务,在开始执行之前都需要(通过您给出的定义)这两个参数。 它不能取t1然后,在稍后给定t2 ,同步返回其结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM