Я столкнулся с нишей в C #, которую я не ожидал. К счастью, мой юнит-тест обнаружил неожиданное поведение, но я удивлен и не понимаю, почему он так себя ведет. Я воспроизвел проблему со следующим кодом.
static void Main(string[] args)
{
var initialCollection = new bool[] { false, true };
var projectedCollection = initialCollection.Select(o => (initialObj: o, Counter: 0)).ToArray();
for (int i = 0; i < 10; i++)
{
var objectFromProjection = projectedCollection.First(o => o.initialObj == (i % 2 == 0));
Console.WriteLine($"For initial obj {objectFromProjection.initialObj}, counter is now {++objectFromProjection.Counter}");
}
Console.ReadKey();
}
Так как я добавил ToArray
после проекции, я ожидал, что переменная счетчика не будет повторно инициализироваться каждый раз до нуля. Тем не менее, он повторно инициализируется до 0 для каждой итерации цикла for
.
Вот вывод:
For initial obj True, counter is now 1
For initial obj False, counter is now 1
For initial obj True, counter is now 1
For initial obj False, counter is now 1
For initial obj True, counter is now 1
For initial obj False, counter is now 1
For initial obj True, counter is now 1
For initial obj False, counter is now 1
For initial obj True, counter is now 1
For initial obj False, counter is now 1
Вот то, что я думал, что это сделает:
For initial obj True, counter is now 1
For initial obj False, counter is now 1
For initial obj True, counter is now 2
For initial obj False, counter is now 2
For initial obj True, counter is now 3
For initial obj False, counter is now 3
For initial obj True, counter is now 4
For initial obj False, counter is now 4
For initial obj True, counter is now 5
For initial obj False, counter is now 5
Почему счетчик сбрасывается в ноль вместо сохранения увеличенного значения?