Fechamentos em delegados de manipulador de eventos em C #? [duplicado]

Esta pergunta já tem uma resposta aqui:

Variável capturada em um loop em C # 8 respostas

Estou vindo de um plano de programação funcional no momento, então me perdoe se não entender os fechamentos em C #.

Eu tenho o seguinte código para gerar dinamicamente botões que recebem manipuladores de eventos anônimos:

for (int i = 0; i < 7; i++)
{
    Button newButton = new Button();

    newButton.Text = "Click me!";

    newButton.Click += delegate(Object sender, EventArgs e)
    {
        MessageBox.Show("I am button number " + i);
    };

    this.Controls.Add(newButton);
}

Eu esperava o texto"I am button number " + i para ser fechado com o valor dei nessa iteração do loop for. No entanto, quando eu executo o programa, todo botão dizI am button number 7. o que estou perdendo? Estou usando o VS2005.

Edit: Então eu acho que minha próxima pergunta é: como capturar o valor?

questionAnswers(5)

yourAnswerToTheQuestion