BC42324: Het gebruik van de iteratievariabele in een lambda-expressie kan onverwachte resultaten hebben

Het gebruik van de iteratievariabele in een lambda-expressie kan onverwachte resultaten hebben. Maak in plaats daarvan een lokale variabele in de lus en wijs deze de waarde van de iteratievariabele toe.

Deze waarschuwing wordt weergegeven wanneer u een lusiteratievariabele gebruikt in een lambda-expressie die in de lus wordt gedeclareerd. In het volgende voorbeeld wordt de waarschuwing bijvoorbeeld weergegeven.

For i As Integer = 1 To 10
    ' The warning is given for the use of i.
    Dim exampleFunc As Func(Of Integer) = Function() i
Next

In het volgende voorbeeld ziet u de onverwachte resultaten die kunnen optreden.

Module Module1
    Sub Main()
        Dim array1 As Func(Of Integer)() = New Func(Of Integer)(4) {}

        For i As Integer = 0 To 4
            array1(i) = Function() i
        Next

        For Each funcElement In array1
            System.Console.WriteLine(funcElement())
        Next

    End Sub
End Module

De For lus maakt een matrix van lambda-expressies, die elk de waarde van de lusiteratievariabele iretourneren. Wanneer de lambda-expressies in de For Each lus worden geƫvalueerd, kunt u verwachten dat 0, 1, 2, 3 en 4 worden weergegeven, de opeenvolgende waarden van i de lus For . In plaats daarvan ziet u de uiteindelijke waarde van i vijf keer weergegeven:

5

5

5

5

5

Dit bericht is standaard een waarschuwing. Zie Waarschuwingen configureren in Visual Basic voor meer informatie over het verbergen van waarschuwingen of het behandelen van waarschuwingen als fouten.

Fout-id: BC42324

Deze fout corrigeren

  • Wijs de waarde van de iteratievariabele toe aan een lokale variabele en gebruik de lokale variabele in de lambda-expressie.
Module Module1
    Sub Main()
        Dim array1 As Func(Of Integer)() = New Func(Of Integer)(4) {}

        For i As Integer = 0 To 4
            Dim j = i
            array1(i) = Function() j
        Next

        For Each funcElement In array1
            System.Console.WriteLine(funcElement())
        Next

    End Sub
End Module

Zie ook