編集:これは、この問題のより単純な例です(元の質問を削除しました):
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
したがって、最初の反復では安全であるのに、2回目の反復で予期しない結果が生じる可能性があるとコンパイラが考える理由はまだわかりません。@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
@Meta-Knightがすでに強調しているように、ローカル変数number1
は冗長であり、コードを読みにくくします。注: 3 つの方法はすべて安全で、正しい結果が得られます。