我尝试使用一些额外的计算来调用我的异步方法的wrap方法:
private async Task<IEnumerable<Dictionary<string, object>>> Execute(Func<Task<IList<Dictionary<string, object>>>> func)
{
var ret = await func();
// Skipped
return ret;
}
它适用于某些情况:
var data = await Execute(() => chain.Start(parameters), args);
其中chain.Start是
async Task<IList<Dictionary<string, object>>> Start(Dictionary<string, object> parameters)
但在某些情况下我的func是不可行的,所以我试图在其中返回Task.FromResult。
var ret = Execute(() => Task.FormResult(new List<Dictionary<string, object>>());
和compilator说,那个
错误24无法将lambda表达式转换为委托类型 'System.Func&GT;&GT;&GT;' 因为块中的某些返回类型不是隐式的 可转换为委托返回类型
在这种情况下可以使用等待吗?或者我应该以同步方式重写我的代码?
答案 0 :(得分:9)
问题是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>>());