任务。什么时候有不同的类型

时间:2016-06-06 19:52:05

标签: c# async-await

我收到以下代码行的编译错误:

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) {}

...其中AppleOrange来自:

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])

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将执行您想要的任务。