Использование переменной итератора в лямбда-выражении может привести к неожиданным результатам
Обновлен: Ноябрь 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