繁体   English   中英

从Task内部返回IEnumerable实现

[英]Returning IEnumerable Implementation from within Task

我可以:

public static IEnumerable<string> Do()
{
   return new List<string>();
}

但是,如果我要返回任务,则不允许做同样的事情:

public static Task<IEnumerable<string>> DoTask()
{
    return Task.Factory.StartNew(() =>
    {
        return new List<string>(); //no no
    });
}

我正在.NET 4.0中实现一个异步存储库,并在此运行。 我只是很好奇为什么编译器包裹在Task中时为什么不能将我的List下来? 当然,我的工作只是在上面抛出AsEnumerable ,但是我想知道为什么存在此限制?

Task<List<string>>Task<IEnumerable<string>>要求Task<T>是协变的,而内部类型是接口。 在这种情况下都不正确,因此不允许进行转换。

明显的修正-通过为lambda明确指定类型,将Task结果转换为必要的类型

return Task.Factory.StartNew((Func<IEnumerable<string>>)
  (() =>
  {
    return new List<string>(); 
  }));

或通过强制转换结果隐式:

  return (IEnumerable<string>)new List<string>();

详细信息- 协方差和协方差常见问题


为什么Task<List<string>>是TaskFactory.StartNew调用的结果:

传递给StartNew调用的Lambda没有显式指定其类型,因此编译器从return语句推断其返回类型。 由于return明确指出了new List...在这种情况下,lambda的总体类型等效于Func<List<string>>

暂无
暂无

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

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