簡體   English   中英

Task.WhenAll具有不同類型

[英]Task.WhenAll With Different Types

我收到以下代碼行的編譯器錯誤:

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

我已經看了這個問題 ,但似乎我已經在做建議的事情,即要求IEnumerable[]而不是Task<IEnumerable>[]

我在做什么錯-如果這不是正確的方法,那么等待和合並兩個LoadItems()方法的結果的LoadItems()方法是什么? 我原本打算這樣做:

result[0].Concat(result[1])

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將執行您想要的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM