代码之家  ›  专栏  ›  技术社区  ›  Community wiki

警告:“在lambda表达式中使用迭代变量可能会产生意外结果”

  •  3
  • Community wiki  · 技术社区  · 1 年前

    编辑 :这是一个更简单的例子(我已经 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
    

    所以我仍然不明白为什么编译器认为我可能会在第二次迭代中得到意想不到的结果,而我在第一次迭代中是安全的。我不认为 interesting link @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已经强调的那样。注意:这三种方法都是安全的,并给出正确的结果。

    2 回复  |  直到 7 年前
        1
  •  4
  •   lee-m Shahriar N Khondokar    13 年前

    Eric Lippert就这个主题写了几篇博客文章(代码示例在C#中,而不是VB中),其中讨论了这类代码可能产生的一些“问题”,你可能会觉得很有趣:

    Closing over the loop variable considered harmful

        2
  •  3
  •   Henk Holterman    13 年前

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

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

    推荐文章