¿Por qué el objeto Task no usa el parámetro que se le pasa?

Estoy usandoTask para procesar múltiples solicitudes en paralelo y pasar un parámetro diferente a cada tarea, pero parece que todas las tareas toman un parámetro final y ejecutan el método usando eso.

A continuación se muestra el código de ejemplo. Esperaba salida como:

0 1 2 3 4 5 6 ..99

pero me sale

100 100 100 ..10.

Puede ser antes de que se llame al método de impresión,iel valor de ya es100 ¿Pero no debería cada método imprimir el parámetro que se le pasa? ¿Por qué método de impresión toma el 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);
    }
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta