簡體   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