Fechos comportando-se de maneira diferente nos loops foreach e foreach

Ao experimentar fechamentos em C #, descobri que eles funcionam inesperadamente se capturam uma variável iteradora em um loop.

var actions = new List<Action>();

foreach (int i in new[] { 1, 2 })
    actions.Add(() => Console.WriteLine(i));

for (int i = 3; i <= 4; i++)
    actions.Add(() => Console.WriteLine(i));

foreach (var action in actions)
    action();

O código acima produz um resultado estranho (estou usando o compilador .NET 4.5):

1
2
5
5

Por que o valor dei capturado de forma diferente por 2 loops quase idênticos?

questionAnswers(2)

yourAnswerToTheQuestion