作为Func <>的结果的任务<IList <>>

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>>()),返回类型FromResultTask<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)