【发布时间】:2011-08-29 10:57:02
【问题描述】:
编辑:下面是这个问题的一个更简单的例子(我有deleted我原来的问题):
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 的interesting link 提供了这种行为的原因,(这不是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 已经强调的那样使代码的可读性降低。注意:这三种方式都是安全的,并且给出了正确的结果。
【问题讨论】:
标签: .net vb.net linq compiler-construction linq-to-dataset