3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

コレクションが変更されました。列挙操作は実行されない可能性があります。

Last updated at Posted at 2016-05-25

凡例

基本的には次のような場合に発生する例外です。

引用元:列挙操作中のコレクションの変更

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するのは本当に必要な箇所だけにする・・・って適当なことやってるからこんなことになるんですね。反省。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?