Partager via


L'utilisation de la variable d'itération dans une expression lambda peut provoquer des résultats inattendus

Mise à jour : novembre 2007

Message d'erreur

L'utilisation de la variable d'itération dans une expression lambda peut provoquer des résultats inattendus. À la place, créez une variable locale dans la boucle et assignez-lui la valeur de la variable d'itération.
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.

Cet avertissement apparaît lorsque vous utilisez une variable d'itération de la boucle dans une expression lambda déclarée à l'intérieur de la boucle. Par exemple, l'exemple suivant entraîne l'affichage de l'avertissement.

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

L'exemple suivant affiche les résultats inattendus qui peuvent se produire.

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

La boucle For crée un tableau d'expressions lambda où chacune retourne la variable de la valeur d'itération de la boucle i. Lorsque les expressions lambda sont évaluées dans la boucle For Each, vous pouvez vous attendre à consulter 0, 1, 2, 3 et 4 affichés, les valeurs consécutives d' i dans la boucle For. À la place, vous voyez la dernière valeur d' i affichée cinq fois :

5

5

5

5

5

Par défaut, ce message est un avertissement. Pour plus d'informations sur le masquage des avertissements ou le traitement des avertissements en tant qu'erreurs, consultez Configuration d'avertissements en Visual Basic.

ID d'erreur : BC42324

Pour corriger cette erreur

  • Assignez la valeur de la variable d'itération à une variable locale et utilisez cette dernière dans l'expression 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
    

Voir aussi

Concepts

Expressions lambda