![](/img/trans.png)
[英]How to mock a method returning Task<IEnumerable<T>> with Task<List<T>>?
[英]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.