在 lambda 表达式中使用迭代变量可能会产生意外的结果
更新:2007 年 11 月
错误消息
在 lambda 表达式中使用迭代变量可能会产生意外的结果。应改为在循环内部创建一个局部变量并将迭代变量的值赋给它。
当您在循环内声明的 lambda 表达式中使用循环迭代变量时,将显示此警告。例如,下面的示例导致显示此警告。
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 循环创建一个 lambda 表达式数组,其中每个表达式都返回循环迭代变量 i 的值。在 For Each 循环中计算 lambda 表达式时,您可能希望看到显示 0、1、2、3 和 4,即 For 循环中的 i 的连续值。但实际上看到的却是 i 的最终值显示了五次:
5
5
5
5
5
默认情况下,此消息是一个警告。有关隐藏警告或将警告视为错误的更多信息,请参见在 Visual Basic 中配置警告。
**错误 ID:**BC42324
更正此错误
将迭代变量的值赋给一个局部变量,并在 lambda 表达式中使用该局部变量。
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