Может кто-нибудь объяснить мне, почему использование итерационной переменной в лямбда-выражении является плохой идеей - PullRequest
1 голос
/ 16 февраля 2012

http://msdn.microsoft.com/en-us/library/bb763133.aspx

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

Он говорит, что результатом всегда будет 5, а именно окончательное значение i. Как получилось?

Они не помещают переменную итерации в "замыкание"?

1 Ответ

4 голосов
/ 16 февраля 2012

Проблема возникает из-за того, что лямбда-выражения выполняются не при создании, а при их вызове.

См. Ссылку ниже: http://blogs.msdn.com/b/vbteam/archive/2007/07/26/closures-in-vb-part-5-looping.aspx

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...