Dmy*_*nko 2 c# generics task-parallel-library
我试图通过一些额外的计算来调用我的异步方法的wrap方法:
private async Task<IEnumerable<Dictionary<string, object>>> Execute(Func<Task<IList<Dictionary<string, object>>>> func)
{
var ret = await func();
// Skipped
return ret;
}
Run Code Online (Sandbox Code Playgroud)
它适用于某些情况:
var data = await Execute(() => chain.Start(parameters), args);
Run Code Online (Sandbox Code Playgroud)
chain.Start是哪里的
async Task<IList<Dictionary<string, object>>> Start(Dictionary<string, object> parameters)
Run Code Online (Sandbox Code Playgroud)
但在某些情况下我的func是不可接受的,所以我试图在其中返回Task.FromResult.
var ret = Execute(() => Task.FormResult(new List<Dictionary<string, object>>());
Run Code Online (Sandbox Code Playgroud)
和compilator说,那
错误24无法转换lambda表达式的委托类型"System.Func >>>",因为一些块的返回类型不隐式转换为委托返回类型
这种情况下可以使用等待吗?或者我应该以同步方式重写我的代码?
Ste*_*ary 10
问题是Task<T>不协变(并且不能,因为它不是接口).
因此,当您编写时Task.FromResult(new List<Dictionary<string, object>>()),返回类型FromResult为Task<List<Dictionary<string, object>>>,无法转换为Task<IList<Dictionary<string, object>>>.
解决方案是FromResult明确指定泛型参数:
var ret = Execute(() => Task.FormResult<IList<Dictionary<string, object>>>(
new List<Dictionary<string, object>>());
Run Code Online (Sandbox Code Playgroud)