2011-01-20 2 views
0

Наткнулся вопрос при написании какой-то код для загрузки settings-- следующий код моего приложения производит ошибку в InvalidOperationException:VB.NET For-Каждая ошибка Loop

For Each c As MapInfo In CurrentMaps 
    AddMap(c, False) 
Next 

Отладчик выдвигает на первый план Следующая и от MSDN page на ошибке, похоже, что это связано с тем, что коллекция (CurrentMaps) каким-то образом изменилась с того момента, когда она последний раз натолкнулась на перечислитель (для обработки для каждого).

Не уверен, почему это произошло, хотя, как AddMap принимает MapInfo ByVal и не касается входа (так коллекция не изменяется).

я изменил его к этому, который отлично работает:

For i As Integer = 0 To CurrentMaps.Count - 1 
    AddMap(CurrentMaps(i), False) 
Next 

Те должны функционально работать так же, верно? Любая идея, почему Для каждого не работает?

Edit:

Ах понял это out-- проблема в том, что я использую CurrentMaps в качестве временной переменной (сбор отслеживание текущих карт), и AddMap обычно используется в приложение, чтобы добавить новый map (что означает как обновление пользовательского интерфейса, так и добавление его в CurrentMaps).

Здесь (при загрузке приложения) я просто использую AddMap для обновления пользовательского интерфейса, но дополнительный вызов для добавления элемента в CurrentMaps все еще существует, поэтому он действительно модифицировал CurrentMaps.

Спасибо за ввод, все!

+0

Что делает 'AddMap'? * * * * Когда-либо касаются 'CurrentMaps'? – cHao

+0

2-й сниппет также не работает, если CurrentMaps - это словарь или отсортированный список. Отвратительный вид необнаруживаемого отказа. –

ответ

2

Нет, они не должны работать одинаково. Вы не можете изменить коллекцию, пока вы ее итерируете, в основном - и похоже, что это то, что происходит.

Из List<T>.GetEnumerator() документов:

An enumerator remains valid as long as the collection remains unchanged. If changes are made to the collection, such as adding, modifying, or deleting elements, the enumerator is irrecoverably invalidated and its behavior is undefined.

Вы не показали, что делает ваш метод AddMap, но я подозреваю, что это добавляет карту CurrentMaps, таким образом недействительность итератора.

Если вы могли бы предоставить нам более подробную информацию о точно, то что AddMap делает, мы можем вам помочь. Что означает False?

+0

Правильно, но если For Every вызывает вызов sub, который просто берет что-то без ссылки на оригинал (ByVal) и логическое, нет никакой причины, по которой коллекция была изменена. – amb9800

+1

@ amb9800: Хорошо, учитывая, что происходит, кажется, что 'AddMap' * * добавляет к той же коллекции, которую вы итерируете. Однако вы не показали этот код. –

+0

Как показано ниже, при повторном просмотре он действительно нечаянно модифицирует CurrentMaps. Благодаря! – amb9800

0

Нет, эти функции работают по-разному. В первой версии используется шаблон .Net IEnumerable(Of T) + IEnumerator(Of T). Нецелесообразно мутировать коллекцию, пересматривая ее с помощью этого шаблона. Многие из типов BCL обеспечивают выполнение этого требования.

Второй просто использует шаблон count + index. При условии, что границы остаются правильными, законно мутировать сбор при перечислении этого шаблона.

Проблема здесь почти наверняка заключается в том, что AddMap косвенно мутирует коллекцию CurrentMaps и, следовательно, создает эту ошибку.

0

Ах понял, что это out-- проблема заключается в том, что я использую CurrentMaps как временные переменные (сбор отслеживание текущих карт) и AddMap обычно используется в приложении, чтобы добавить новую карту (что означает как обновление пользовательского интерфейса, так и добавление его к CurrentMaps).

Здесь (при загрузке приложения), я только с помощью AddMap для обновления пользовательского интерфейса, но вспомогательный вызов, чтобы добавить товар в CurrentMaps все еще был там, так что это было на самом деле изменения CurrentMaps.

Спасибо за ввод, все!

+0

Вы должны изменить свой исходный вопрос и добавить это как дополнительную информацию вместо создания нового ответа. –

0
Private Maps as list(of MapInfo) 

For each iMaps as MapInfo in CurrentMaps 

    Maps.add(iMaps) 

Next 

 Смежные вопросы

  • Нет связанных вопросов^_^