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

したがって、最初の反復では安全であるのに、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 つの方法はすべて安全で、正しい結果が得られます。

4

2 に答える 2

4

Eric Lippert は、このトピックに関するいくつかのブログ投稿を書きました (コード例は VB ではなく C# で記述されています)。この種のコードから発生する可能性のある「落とし穴」について説明しています。

有害と見なされるループ変数を閉じる

于 2011-08-29T15:24:20.730 に答える
3

メッセージが言うように、それは望ましくない影響を「持つかもしれない」。あなたの場合、.ToList()それは安全になりますが、それはコンパイラが検証するのは難しいです。

Dim exc = excel標準の「ベストプラクティス」として、ローカル変数()へのコピーを採用することをお勧めします

于 2011-08-29T11:13:43.470 に答える