2013-11-28 150 views
1

我試圖做包裝方法調用我的異步方法有一些額外的計算:任務<IList<>>爲Func鍵<>的結果

private async Task<IEnumerable<Dictionary<string, object>>> Execute(Func<Task<IList<Dictionary<string, object>>>> func) 
{ 
    var ret = await func(); 
    // Skipped 
    return ret; 
} 

它完全適用於某些情況下:

var data = await Execute(() => chain.Start(parameters), args); 

其中chain.Start是

async Task<IList<Dictionary<string, object>>> Start(Dictionary<string, object> parameters) 

,但在某些情況下,我的FUNC不是awaitable,所以我試圖與r eturn Task.FromResult就可以了。

var ret = Execute(() => Task.FormResult(new List<Dictionary<string, object>>()); 

和compilator說,那

錯誤24無法轉換lambda表達式的委託類型 「System.Func >>>」 因爲一些塊中的返回類型不是隱含 可轉換爲代表返回類型

這種情況下可以使用awaitable嗎?或者我應該以同步方式重寫我的代碼?

+0

[Offtopic]德米特羅,你是烏克蘭? – 2013-11-28 09:27:30

+0

@Elliot,當然 –

回答

7

問題是Task<T>不是協變的(不能是,因爲它不是接口)。

因此,當您編寫Task.FromResult(new List<Dictionary<string, object>>())時,返回類型FromResultTask<List<Dictionary<string, object>>>,它不能轉換爲Task<IList<Dictionary<string, object>>>

解決的辦法是明確指定FromResult通用參數:

var ret = Execute(() => Task.FormResult<IList<Dictionary<string, object>>>(
    new List<Dictionary<string, object>>()); 
+0

你救了我一天) –

相關問題