13

私はタスクを試していました。なぜこれはループの各値ではなく10を出力するのですか?

public static void StartTasks()
{
    Task[] tasks = new Task[10];
    for (int i = 0; i < 10; i++)
        tasks[i] = new Task(() => Console.WriteLine(i));

    foreach (Task task in tasks)
    {
        task.Start();                       
    }       
}
4

2 に答える 2

20

C# ラムダは、変数の値ではなく、変数への参照をキャプチャします。

値をキャプチャする場合は、最初にループ内で値のコピーを作成する必要があります。これにより、キャプチャはローカル スコープの変更されない変数への参照を取得します。

public static void StartTasks()
{
    Task[] tasks = new Task[10];
    for (int i = 0; i < 10; i++) {
        int j = i;
        tasks[i] = new Task(() => Console.WriteLine(j));
    }

    foreach (Task task in tasks)
    {
        task.Start();                       
    }       
}
于 2012-12-09T03:34:31.127 に答える