El uso de una variable de iteración en una expresión lambda puede producir resultados inesperados.

El uso de una variable de iteración en una expresión lambda puede producir resultados inesperados.En su lugar, cree una variable local dentro del bucle y asígnele el valor de la variable de iteración.

Esta advertencia aparece al utilizar una variable de iteración de bucle en una expresión lambda que se declara dentro del bucle. El ejemplo siguiente provoca la aparición de la advertencia.

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

El ejemplo siguiente muestra los resultados inesperados que se pueden producir.

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

El bucle For crea una matriz de expresiones lambda, cada una de las cuales devuelve el valor de la variable de iteración del bucle i. Cuando las expresiones lambda se evalúan en el bucle For Each, se espera ver 0, 1, 2, 3 y 4, los valores sucesivos de i en el bucle For. En su lugar, ve el valor final de i mostrado cinco veces:

5

5

5

5

5

De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar advertencias o tratarlas como errores, vea Configurar advertencias en Visual Basic.

Id. de error: BC42324

Para corregir este error

  • Asigne el valor de la variable de iteración a una variable local y use la variable local en la expresión 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
    

Vea también

Conceptos

Lambda (expresiones) (Visual Basic)