Por que o objeto Task não usaria o parâmetro passado para ele?

estou a usarTask para processar múltiplas solicitações em paralelo e passar um parâmetro diferente para cada tarefa, mas parece que todas as tarefas pegam um parâmetro final e executam o método usando isso.

Abaixo está o código de exemplo. Eu estava esperando a saída como:

0 1 2 3 4 5 6 ..99

mas eu recebo:

100 100 100 ..10.

Pode ser antes que o método de impressão seja chamado,iO valor já é100 mas não deve cada método imprimir o parâmetro passado para ele? Por que método de impressão leva o valor final dei?

class Program
{
    static void Main(string[] args)
    {
        Task[]t = new Task[100];
        for (int i = 0; i < 100; i++)
        {
            t[i] = Task.Factory.StartNew(() => print(i));
        }
        Task.WaitAll(t);
        Console.WriteLine("complete");
        Console.ReadLine();
    }

    private static void print(object i)
    {

        Console.WriteLine((int)i);
    }
}

questionAnswers(3)

yourAnswerToTheQuestion