L'utilizzo della variabile di iterazione in un'espressione lambda può produrre risultati imprevisti

Aggiornamento: novembre 2007

Messaggio di errore

L'utilizzo della variabile di iterazione in un'espressione lambda può produrre risultati imprevisti. Creare una variabile locale all'interno del ciclo e assegnarvi il valore della variabile di iterazione.
Using the iteration variable in a lambda expression may have unexpected results. Instead, create a local variable within the loop and assign it the value of the iteration variable.

Questo avviso viene visualizzato quando si utilizza una variabile di iterazione del cliclo in un'espressione lambda dichiarata all'interno del ciclo. Nell'esempio seguente, ad esempio, viene generato questo avviso.

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

Nell'esempio seguente vengono illustrati i risultati imprevisti che potrebbero verificarsi.

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

Il ciclo For crea una matrice di espressioni lambda, ognuna delle quali restituisce il valore della variabile di iterazione del ciclo i. Quando le espressioni lambda vengono valutate nel ciclo For Each, dovrebbero venire visualizzati 0, 1, 2, 3 e 4, i valori successivi di i nel ciclo For. Viene invece visualizzato il valore finale di i per cinque volte:

5

5

5

5

5

Per impostazione predefinita, si tratta di un messaggio di avviso. Per ulteriori informazioni su come nascondere gli avvisi o considerarli come errori, vedere Configurazione degli avvisi in Visual Basic.

ID errore: BC42324

Per correggere l'errore

  • Assegnare il valore della variabile di iterazione a una variabile locale e utilizzare la variabile locale nell'espressione lambda.

    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
    

Vedere anche

Concetti

Espressioni lambda