foreach 関数を linq 関数に変換しようとしています
これが私の通常のコードです[正常に動作します]
var tList = new List<Func<Task<bool>>> { Method1, Method2 };
tList.Shuffle();
int succeed = 0;
foreach (var task in tList)
{
var result = await task();
if(!result)
break;
succeed += 1;
}
MessageBox.Show(succeed == 1 ? "Loading complete." : "Something went wrong!");
そして、これがLinqに変換された後です[2つのコンパイラエラーを与える]
var tList = new List<Func<Task<bool>>> { Method1, Method2 };
tList.Shuffle();
int succeed = tList.Select(async task => await task()).TakeWhile(result => result).Count();
MessageBox.Show(succeed == 1 ? "Loading complete." : "Something went wrong!");
エラー
ブロック内の戻り値の型の一部がデリゲートの戻り値の型に暗黙的に変換できないため、ラムダ式をデリゲート型 'System.Func,bool>' に変換できません- タイプ 'System.Threading.Tasks.Task' を 'bool' に暗黙的に変換できません
なぜコンパイラがこれらのメッセージを表示しているのか疑問に思うので、助けていただければ幸いです。
注:私も.TakeWhile(async result => await result)
そのエラーで試しました
- 非同期メソッドの戻り値の型は、void、Task、または Task T でなければなりません
Method1 と Method2 が必要な場合:
public async Task<bool> Method1()
{
await Task.Delay(1000);
Console.WriteLine("Method1");
return false;
}
public async Task<bool> Method2()
{
await Task.Delay(1000);
Console.WriteLine("Method2");
return true;
}