Reputation: 460340
Edit: Here is a much more simpler example of this issue (i've deleted my original question):
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
So i still don't understand why the compiler thinks that i may get unexpected results in the second iteration whereas i'm safe with the first. I don't think that the interesting link of @ee-m provides the reason for this behaviour,(this is not a for-each
issue, For n1 As Int32 = 1 To 3
would also result in a compiler warning).
I'm not really convinced that following should be "best-practice":
For Each n1 In numbers1
Dim number1 = n1
' no warning'
Dim contains = (From num In numbers2 Where num = number1).Any
Next
The local variable number1
is redundant and makes the code less readable as @Meta-Knight already has emphasized. Note: All three ways are safe and give the correct result.
Upvotes: 3
Views: 1727
Reputation: 2267
Eric Lippert wrote a couple of blog posts on this topic (code examples are in C#, not VB) which goes over some of the "gotchas" that can arise from this sort of code which you may find interesting:
Closing over the loop variable considered harmful
Upvotes: 4
Reputation: 273824
As the message says, it "may have" undesired effects. In your case the .ToList()
makes it safe but that is hard for the compiler to verify.
I would suggest to adopt copying to a local var (Dim exc = excel
) as standard 'best practice'
Upvotes: 3