OriginalGriff
При использовании foreach
цикл, вы устанавливаете и используете что-то под названием an enumerator
который возвращает каждый элемент в последовательности, как вы идете вокруг цикла. Если вы измените объект то enumerator
работает, он не может быть уверен, над каким элементом работать дальше, и поэтому вы получаете ошибку.
Эффективно, то foreach
петля устанавливается на петли:
int count = deck.Count;
for (int i = 0; i < count; i++)
{
Card c = deck[i];
Console.WriteLine(c);
}
Если вы начнете удалять карты внутри цикла:
int count = deck.Count;
for (int i = 0; i < count; i++)
{
Card c = deck[i];
if (c.IsSpade)
{
deck.Remove(c);
}
Console.WriteLine(c);
}
Тогда это вызовет две проблемы:
1) он не будет печатать карту после лопаты.
2) он будет сбегать с конца колоды, потому что петля этого не "знает".
i
больше не стоит подниматься так высоко.
(
foreach
это не так - это довольно сложно внутренне, но принцип тот же самый)
Вы не можете изменить набор внутри
foreach
, или изменить значение параметра
foreach
переменная внутри цикла.
Попробуйте вместо этого:
while(objStack.Count > 0)
{
Console.WriteLine(" {0}", objStack.Pop());
}
Или возможно:
foreach (Object i in objStack)
{
Console.WriteLine(" {0}", i);
}