Die Verwendung der Iterationsvariablen in einem Lambda-Ausdruck kann zu unerwarteten Ergebnissen führen
Aktualisiert: November 2007
Fehlermeldung
Die Verwendung der Iterationsvariablen in einem lambda-Ausdruck kann zu unerwarteten Ergebnissen führen. Erstellen Sie stattdessen in der Schleife eine lokale Variable, und weisen Sie dieser den Wert der Iterationsvariablen zu.
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.
Diese Warnung wird angezeigt, wenn Sie eine Schleifeniterationsvariable in einem lambda-Ausdruck verwenden, der innerhalb der Schleife deklariert wird. In folgendem Beispiel wird die Warnung angezeigt.
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
In folgendem Beispiel werden die unerwarteten Ergebnisse, die auftreten könnten, veranschaulicht.
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
Die For-Schleife erzeugt ein Array von lambda-Ausdrücken, von denen jeder den Wert der Schleifeniterationsvariable i zurückgibt. Wenn die lambda-Ausdrücke in der For Each-Schleife ausgewertet werden, erwarten Sie wahrscheinlich, dass die aufeinanderfolgenden Werte von i in der For-Schleife – 0, 1, 2, 3 und 4 – angezeigt werden. Stattdessen wird der letzte Wert von i fünfmal angezeigt:
5
5
5
5
5
Standardmäßig ist diese Meldung eine Warnung. Weitere Informationen über das Ausblenden von Warnungen bzw. über die Behandlung von Warnungen als Fehler finden Sie unter Konfigurieren von Warnungen in Visual Basic.
Fehler-ID: BC42324
So beheben Sie diesen Fehler
Weisen Sie einer lokalen Variable den Wert der Iterationsvariable zu, und verwenden Sie die lokale Variable im lambda-Ausdruck.
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