BC42324: Användning av iterationsvariabeln i ett lambda-uttryck kan ha oväntade resultat

Att använda iterationsvariabeln i ett lambda-uttryck kan ha oväntade resultat. Skapa i stället en lokal variabel i loopen och tilldela den värdet för iterationsvariabeln.

Den här varningen visas när du använder en loop-iterationsvariabel i ett lambda-uttryck som deklareras i loopen. I följande exempel visas till exempel varningen.

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

I följande exempel visas oväntade resultat som kan uppstå.

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

Loopen For skapar en matris med lambda-uttryck, som var och en returnerar värdet för loop-iterationsvariabeln i. När lambda-uttrycken utvärderas i loopen For Each kan du förvänta dig att 0, 1, 2, 3 och 4 visas, de efterföljande värdena i för i -loopen For . I stället visas det slutliga värdet i för fem gånger:

5

5

5

5

5

Som standard är det här meddelandet en varning. Mer information om hur du döljer varningar eller behandlar varningar som fel finns i Konfigurera varningar i Visual Basic.

Fel-ID: BC42324

Så här åtgärdar du det här felet

  • Tilldela värdet för iterationsvariabeln till en lokal variabel och använd den lokala variabeln i lambda-uttrycket.
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

Se även