Поделиться через


Использование переменной итератора в лямбда-выражении может привести к неожиданным результатам

Обновлен: Ноябрь 2007

Сообщение об ошибке

Использование переменной итерации в лямбда-выражении может привести к неожиданным результатам. Вместо этого создайте локальную переменную в пределах цикла и присвойте ей значение переменной итерации.
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.

Это предупреждение возникает, когда вы используете переменную итерации цикла в лямбда-выражении, объявленном внутри цикла. Например, предупреждение выводится в следующем случае.

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

Приведенный пример демонстрирует возможный неожиданный результат.

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

Цикл For создает массив лямбда-выражений, каждое из которых возвращает значение переменной итерации цикла i. При оценке лямбда-выражений в цикле For Each ожидается появление значений 0, 1, 2, 3 или 4, т.е. последовательных значений i в цикле For. Но, вместо этого пять раз подряд выводится окончательное значение i:

5

5

5

5

5

По умолчанию это сообщение является предупреждающим. Дополнительные сведения о скрытии предупреждений или обработке предупреждений как ошибок содержатся в разделе Настройка предупреждений в Visual Basic.

Идентификатор ошибки: BC42324

Исправление этой ошибки

  • Назначьте локальной переменной значение переменной итерации и используйте локальную переменную в лямбда-выражении.

    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
    

См. также

Основные понятия

Лямбда-выражения