3

编辑:这是这个问题的一个更简单的例子(我删除了我原来的问题):

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 已经强调的那样,局部变量是多余的,并且使代码的可读性降低。注意:所有三种方式都是安全的并且给出正确的结果。

4

2 回答 2

4

Eric Lippert 写了几篇关于这个主题的博客文章(代码示例是用 C# 编写的,而不是 VB),其中讨论了一些您可能会觉得有趣的代码可能产生的“陷阱”:

关闭被认为有害的循环变量

于 2011-08-29T15:24:20.730 回答
3

正如消息所说,它“可能”产生不良影响。在您的情况下,.ToList()这使它安全,但编译器很难验证。

我建议采用复制到本地 var ( Dim exc = excel) 作为标准的“最佳实践”

于 2011-08-29T11:13:43.470 回答