我收到以下代码行的编译错误:
IEnumerable<IPurchasedItem<IFruit>>[] result = await Task.WhenAll(
repository1.LoadItems(id),
repository2.LoadItems(id)
);
错误CS0029无法将类型'void'隐式转换为
System.Collections.Generic.IEnumerable<IPurchasedItem<IFruit>>[]
我的存储库方法如下:
public async Task<IEnumerable<IPurchasedItem<Apple>>> LoadItems(int id) {}
public async Task<IEnumerable<IPurchasedItem<Orange>>> LoadItems(int id) {}
...其中Apple
和Orange
来自:
public interface IPurchasedItem<out T> : where T : IFruit {}
public class Fruit : IFruit {}
public class Apple : Fruit {}
public class Orange : Fruit {}
我看过this question,但似乎我已经在做了建议,即要求IEnumerable[]
而不是Task<IEnumerable>[]
。
我做错了什么 - 如果这不是正确的方法,那么我等待和合并两种LoadItems()
方法的结果的最佳方式是什么?
我原本打算这样做:
result[0].Concat(result[1])
答案 0 :(得分:4)
Task<T>
是一个类,因此是不变的。因此,Task<string>
不是Task<object>
- 而且作为一个更复杂的示例,Task<IEnumerable<IPurchasedItem<Apple>>>
不是Task<IEnumerable<IPurchasedItem<Fruit>>>
,这是您想要的。
当然,您可以编写一种方法从一种方法转换为另一种方法 - 例如:
public static Task<TTarget> Convert<TSource, TTarget>(Task<TSource> task)
where TSource : TTarget
{
return await task;
}
然后,您可以将所有特定任务转换为Task<IEnumerable<IPurchasedItem<Fruit>>>
任务,然后 Task.WhenAll
将执行您想要的任务。