Partilhar via


Uso da variável de iteração em uma expressão lambda pode ter resultados inesperados

Mensagem de erro

Uso da variável de iteração em uma expressão lambda pode ter resultados inesperados.Em vez disso, crie uma variável local dentro do loop e atribua o valor da variável de iteração.

Esse aviso aparece quando você usa uma variável de iteração do loop em uma expressão lambda que é declarada dentro do loop.Por exemplo, o exemplo a seguir faz com que o aviso apareça.

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

O exemplo a seguir mostra os resultados inesperados que possam ocorrer.

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

The For loop cria uma matriz de expressões lambda, cada um deles retorna o valor da variável de iteração do loop i. Quando as expressões lambda são avaliadas no For Each loop, você pode esperar ver 0, 1, 2, 3 e 4 exibida, os valores de sucessivos i no For loop. Em vez disso, você ver o valor final de i exibido cinco vezes:

5

5

5

5

5

Por padrão, essa é uma mensagem de aviso.Para maiores informações sobre como ocultar avisos ou tratar avisos como erros, consulte Configurando Avisos (Warnings) no Visual Basic.

ID de erro: BC42324

Para corrigir este erro

  • Atribuir o valor da variável de iteração a uma variável local e usar a variável local na expressão 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
    

Consulte também

Conceitos

Expressões Lambda