Information
The topic you requested is included in another documentation set. For convenience, it's displayed below. Choose Switch to see the topic in its original location.

Using the iteration variable in a lambda expression may have unexpected results

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.

This warning appears when you use a loop iteration variable in a lambda expression that is declared inside the loop. For example, the following example causes the warning to appear.

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

The following example shows the unexpected results that might occur.

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 creates an array of lambda expressions, each of which returns the value of the loop iteration variable i. When the lambda expressions are evaluated in the For Each loop, you might expect to see 0, 1, 2, 3, and 4 displayed, the successive values of i in the For loop. Instead, you see the final value of i displayed five times:

5

5

5

5

5

By default, this message is a warning. For more information about hiding warnings or treating warnings as errors, see Configuring Warnings in Visual Basic.

Error ID: BC42324

To correct this error

  • Assign the value of the iteration variable to a local variable, and use the local variable in the lambda expression.

    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
    
Was this page helpful?
(1500 characters remaining)
Thank you for your feedback
Show:
© 2014 Microsoft