Часто встречающейся проблема в C#, связанной с захватом переменной цикла в лямбда-выражении: Когда внутри цикла создаются лямбда-выражения, которые используют переменную цикла `i`, все эти лямбда-выражения не получают копию текущего значения `i` на каждой итерации. Вместо этого они захватывают саму переменную `i`, которая является одной и той же для всех лямбда-выражений. Это значит, что когда лямбда-выражения вызываются после завершения цикла, все они будут использовать последнее значение `i`, которое было в цикле после его завершения.
![[var actions.png|500]]
Это противоречит интуитивному пониманию, что каждое лямбда-выражение должно использовать значение `i` на момент своего создания. Чтобы решить эту проблему, обычно создают копию переменной `i` внутри тела цикла:
```csharp
for (int i = 0; i < 5; i++)
{
int copy = i; // Создаем копию для каждой итерации
actions.Add(item => copy * 2); // Используем копию в лямбда-выражении
}
```
Так каждое лямбда-выражение будет захватывать свою собственную копию `copy`, и вызов каждого делегата будет давать разное значение, соответствующее тому значению `i`, которое было при создании лямбда-выражения.