0

アプリの設定を読み込むコードを記述しているときに問題が発生しました。次のコードではInvalidOperationExceptionエラーが発生します。

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

デバッガーはNext部分を強調表示します。エラーのMSDN ページから、これはコレクション ( CurrentMaps ) が最後に列挙子をバンプしたとき ( For Eachを処理するため) から何らかの形で変更されたためのようです。

ただし、AddMapMapInfo ByVal を取得し、入力に触れないため (したがって、コレクションは変更されません)、なぜそれが起こるのかわかりません。

これを次のように変更しました。これは完全に正常に動作します。

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

それらは機能的に同じように機能するはずですよね?For Eachが機能しない理由は何ですか?

編集:

ああ、それを理解しました-問題は、CurrentMaps を一時変数 (現在のマップを追跡するコレクション) として使用し、AddMap は通常、アプリ内で新しいマップを追加するために使用されることです (つまり、UI の更新と CurrentMaps への追加の両方を意味します)。 )。

ここでは (アプリをロードするとき)、AddMap を使用して UI を更新しているだけですが、項目を CurrentMaps に追加するためのサブ呼び出しがまだ残っているため、実際には CurrentMaps を変更していました。

ご意見ありがとうございます。

4

4 に答える 4

2

いいえ、同じようには機能しません。基本的に、反復処理中にコレクションを変更することはできません。それが起こっているようです。

List<T>.GetEnumerator()ドキュメントから:

コレクションが変更されない限り、列挙子は有効なままです。要素の追加、変更、または削除などの変更がコレクションに加えられた場合、列挙子は回復できないほど無効になり、その動作は未定義になります。

メソッドが何をするかを示していませんが、マップを に追加するため、イテレータが無効にAddMapなっていると思われます。CurrentMaps

正確に何が機能するかについてより多くの情報を提供AddMapしていただければ、より多くのことをお手伝いできます。とはFalseどういう意味ですか?

于 2011-01-20T18:27:45.640 に答える
0

ああ、わかりました-問題は、CurrentMapsを一時変数(現在のマップを追跡するコレクション)として使用することです。AddMapは通常、アプリ内で新しいマップを追加するために使用されます(つまり、UIの更新とCurrentMapsへの追加の両方を意味します)。 )。

ここ(アプリの読み込み時)では、AddMapを使用してUIを更新していますが、アイテムをCurrentMapsに追加するサブ呼び出しがまだ存在していたため、実際にCurrentMapsを変更していました。

入力ありがとうございます、すべて!

于 2011-01-20T18:36:27.820 に答える
0

いいえ、これらの機能は大きく異なります。最初のバージョンは .Net IEnumerable(Of T)+IEnumerator(Of T)パターンを使用します。このパターンで列挙している間にコレクションを変更することは合法ではありません。BCL タイプの多くは、この要件を強制します。

2 番目は単純にカウント + インデックス パターンを使用します。境界が正しいままであれば、このパターンで列挙中にコレクションを変更することは合法です。

ここでの問題は、ほぼ確実AddMapにコレクションを間接的に変更CurrentMapsしているため、このエラーが発生することです。

于 2011-01-20T18:28:39.910 に答える
0
Private Maps as list(of MapInfo)

For each iMaps as MapInfo in CurrentMaps

  Maps.add(iMaps)

Next
于 2014-03-12T12:01:37.533 に答える