凡例
基本的には次のような場合に発生する例外です。
引用元:列挙操作中のコレクションの変更
List, Dictionary, Queueなど、要素を動的に追加・削除できるコレクションをforeach文/For Eachステートメントで列挙する場合、列挙中に追加・削除等の操作を行うことはできません。
その他の例
そのほか、こんなパターンでも起きました。ハマりました。
落ちる例
Private Function GenerateRow(ByRef data As String) As DataGridViewRow
' ByRefしているが、dataに対しては参照処理のみ行っている
...
End Function
Private Sub ViewGird()
Dim additionalRow As DataGridViewRow
Dim dict As Dictionary(Of Integer, String)
...
For Each key As Integer In dict.Keys
' ここが更新処理扱いになる!
additionalRow = GenerateRow(dict(key))
...
' Nextで次のループを開始しようとしたタイミングで例外発生
Next
...
End Sub
ByRefではなく、ちゃんとByValで受け取るようにすると、正常に動きます。
落ちない例
Private Function GenerateRow(ByVal data As String) As DataGridViewRow
' dataに対しては参照処理のみ行っているので、ByValで受け取りましょう
...
End Function
Private Sub ViewGird()
Dim additionalRow As DataGridViewRow
Dim dict As Dictionary(Of Integer, String)
...
For Each key As Integer In dict.Keys
additionalRow = GenerateRow(dict(key))
...
' 正常にループしてくれます
Next
...
End Sub
まとめ
ByRefするのは本当に必要な箇所だけにする・・・って適当なことやってるからこんなことになるんですね。反省。