编辑:这是一个更简单的例子来说明这个问题(我已经删除了原始问题):
Dim numbers1 As New List(Of Int32)({1, 2, 3})
Dim numbers2 As New List(Of Int32)({3, 4, 5})
For Each n1 In numbers1
' no warning '
Dim contains = numbers2.Contains(n1)
Next
For Each n1 In numbers1
' warning on n1'
Dim contains = (From num In numbers2 Where num = n1).Any
Next
所以我仍然不明白为什么编译器认为我在第二次迭代中可能会得到意外的结果,而我在第一次迭代中是安全的。我不认为@ee-m的有趣的链接提供了这种行为的原因(这不是一个
for-each
问题,For n1 As Int32 = 1 To 3
也会导致编译器警告)。我并不真正相信以下应该是“最佳实践”:
For Each n1 In numbers1
Dim number1 = n1
' no warning'
Dim contains = (From num In numbers2 Where num = number1).Any
Next
本地变量number1
是多余的,正如@Meta-Knight已经强调的那样,它使代码不易读。注意:这三种方法都是安全的,并且可以得到正确的结果。
For n1 As Int32 = 1 To 3
替换for-each循环,问题仍然存在。那么变量的作用域不应该是循环体内吗? - Tim Schmelter