1

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;
}
4

3 に答える 3