2016-10-27 27 views
1

次のコードでエラーが発生します。非同期ラムダ式をデリゲート型 'Func <bool、string、bool>'に変換できません。

public async Task<bool> FlushUrlAsync(Uri url, bool recursive, CancellationToken token = default(CancellationToken)) 
{ 
    _serverPortsConfig.CacheServerPorts 
     .Select(cacheServerPort => $"http://{url.Host}:{cacheServerPort}{url.AbsolutePath}") 
     .Aggregate(true, (current, memoryCacheUrl) => current && await FlushUrlAsync(recursive, memoryCacheUrl)); //<--- produces the next error: 
    // Cannot convert async lambda expression to delegate type 
    // 'Func<bool, string, bool>'. An async lambda expression may return 
    // void, Task or Task<T>, none of which are convertible to 
    // 'Func<bool, string, bool>'. 
} 

この方法は

private async Task<bool> FlushUrlAsync(bool recursive, string memoryCacheUrl) 
{ 
    return await someMagic(); //for clearity I removed the code. 
} 

次の関数を呼び出し、それは次のようにたくさん見える:Convert async lambda expression to delegate type System.Func<T>?、howevery、そこに解決策は、/それは私のために動作させることはできませんではないでしょう。

私が持っていた:

var result = true; 
foreach (var cacheServerPort in _serverPortsConfig.CacheServerPorts) 
{ 
    var memoryCacheUrl = $"http://{url.Host}:{cacheServerPort}{url.AbsolutePath}"; 
    result = result && await FlushUrlAsync(memoryCacheUrl, recursive); 
} 

return result; 

はその後ReSharperの私に提供されたコードを与えたが、ちょうど非同期キーワードは動作しません加えます。

.Aggregate(true, async (current, memoryCacheUrl) => current && await FlushUrlAsync(recursive, memoryCacheUrl)); 

私はerorrを与えます:非同期メソッドの戻り値の型はvoid、taskまたはTaskでなければなりません。

任意のアイデア?

答えて

3

foreach実装を個人的に使用しますが、具体的な質問には回答します。

asyncことなく使用Aggregate過負荷は、次のシグネチャがあります。

bool Aggregate<bool, string>(bool seed, Func<bool, string, bool> func) 

funcパラメータ注 - それはboolを返すboolstringを受信する方法です。重要な部分は、最初の引数の型が結果の型と同じであることと、seedの型のパラメータです。

asyncラムダはTask派生オブジェクトを返さなければなりません。あなたはbool結果が必要なので、Task<bool>でそれを代用してみましょう:以下の解決策につながる

Task<bool> Aggregate<bool, string>(Task<bool> seed, Func<Task<bool>, string, Task<bool>> func) 

を:

return await _serverPortsConfig.CacheServerPorts 
    .Select(cacheServerPort => $"http://{url.Host}:{cacheServerPort}{url.AbsolutePath}") 
    .Aggregate(Task.FromResult(true), async (current, memoryCacheUrl) => 
     await current && await FlushUrlAsync(recursive, memoryCacheUrl)); 
+0

完璧!しかし、私は同意する必要があります.... foreachを使用すると、より読みやすくなります。 –

関連する問題