BC42324: ラムダ式で反復変数を使用すると、予期しない結果になる可能性があります

ラムダ式で反復変数を使用すると、予期しない結果になる可能性があります。 代わりに、ループ内にローカル変数を作成し、反復変数の値を割り当てます。

この警告は、ループ内で宣言されているラムダ式でループ反復変数を使用すると表示されます。 たとえば、次の例では警告が表示されます。

For i As Integer = 1 To 10
    ' The warning is given for the use of i.
    Dim exampleFunc As Func(Of Integer) = Function() i
Next

次の例は、予期しない結果が発生する可能性があることを示しています。

Module Module1
    Sub Main()
        Dim array1 As Func(Of Integer)() = New Func(Of Integer)(4) {}

        For i As Integer = 0 To 4
            array1(i) = Function() i
        Next

        For Each funcElement In array1
            System.Console.WriteLine(funcElement())
        Next

    End Sub
End Module

Forループはラムダ式の配列を作成し、それぞれがループ反復変数iの値を返します。 ラムダ式がFor Each ループで評価されると、0、1、2、3、4 が表示され、For ループ内のiの連続する値が表示されることがあります。 代わりに、 i の最終的な値が 5 回表示されます。

5

5

5

5

5

既定では、このメッセージは警告です。 警告の非表示または警告をエラーとして扱う方法の詳細については、「 Visual Basic での警告の構成」を参照してください。

エラー ID: BC42324

このエラーを解決するには

  • 反復変数の値をローカル変数に割り当て、ラムダ式でローカル変数を使用します。
Module Module1
    Sub Main()
        Dim array1 As Func(Of Integer)() = New Func(Of Integer)(4) {}

        For i As Integer = 0 To 4
            Dim j = i
            array1(i) = Function() j
        Next

        For Each funcElement In array1
            System.Console.WriteLine(funcElement())
        Next

    End Sub
End Module

こちらも参照ください