任务<IList的<>&GT;由于Func&lt;&gt; </ilist <>

时间:2013-11-28 09:08:26

标签: 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;
}

它适用于某些情况:

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;'   因为块中的某些返回类型不是隐式的   可转换为委托返回类型

在这种情况下可以使用等待吗?或者我应该以同步方式重写我的代码?

1 个答案:

答案 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>>());