Это ошибка в Silverlight InkPresenter - PullRequest
2 голосов
/ 10 января 2011

Вот фрагмент кода, который не требует пояснений:

while (myInkPresenter.Children.Count > 0)
{
  myInkPresenter.Children.RemoveAt(myInkPresenter.Children.Count - 1);
}

Тогда я подумал, что лучшим способом может быть:

foreach (UIElement item in myInkPresenter.Children)
{
  myInkPresenter.Children.Remove(item);
}

Однако это приводит к ошибке: операция недопустима из-затекущее состояние объекта.Поэтому я подумал и добавил дополнительную строку кода:

foreach (UIElement item in myInkPresenter.Children)
{
  myInkPresenter.Children.Remove(item);
  if (myInkPresenter.Children.Count == 0) break;
}

, и теперь он работает нормально.

Мой вопрос в том, является ли это ошибкой, или мне по какой-то причине следует ожидать такого поведения

1 Ответ

4 голосов
/ 10 января 2011

Ваш код будет работать только тогда, когда есть только один ребенок. Он сломается, если их будет больше - он попытается найти «следующий» элемент и заметит, что его внутренняя коллекция изменилась, что делает итератор недействительным.

Это не имеет ничего общего с InkPresenter как таковым - почти все коллекции в .NET работают таким образом. По сути, вы не должны изменять коллекцию, пока вы ее перебираете. (Параллельные коллекции в .NET 4 представляют собой заметный набор исключений из этого правила.)

Учитывая, что вы просто хотите очистить список детей, почему бы просто не позвонить:

myInkPresenter.Children.Clear();

? Проще, удобочитаемее и эффективнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...