BC42324: Az iterációs változó lambda kifejezésben való használata váratlan eredményeket eredményezhet

Az iterációs változó lambda kifejezésben való használata váratlan eredményeket eredményezhet. Ehelyett hozzon létre egy helyi változót a hurokban, és rendelje hozzá az iterációs változó értékét.

Ez a figyelmeztetés akkor jelenik meg, ha egy ciklus iterációs változót használ a cikluson belül deklarált lambda kifejezésben. Az alábbi példában például megjelenik a figyelmeztetés.

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

Az alábbi példa az esetlegesen előforduló váratlan eredményeket mutatja be.

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

A For hurok lambdakifejezések tömböt hoz létre, amelyek mindegyike a hurok iterációs változójának iértékét adja vissza. Amikor a lambda kifejezések kiértékelése a For Each hurokban történik, a ciklus egymást követő értékeinek 0, 1, 2, 3 és 4 értékére iFor számíthat. Ehelyett az ötször megjelenő végső érték i jelenik meg:

5

5

5

5

5

Ez az üzenet alapértelmezés szerint figyelmeztetés. A figyelmeztetések elrejtésével vagy a figyelmeztetések hibákként való kezelésével kapcsolatos további információkért lásd: Figyelmeztetések konfigurálása a Visual Basicben.

Hibaazonosító: BC42324

A hiba kijavítása

  • Rendelje hozzá az iterációs változó értékét egy helyi változóhoz, és használja a helyi változót a lambda kifejezésben.
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

Lásd még