Der Lambda-Ausdruck wird nicht aus diesem Ereignishandler entfernt

Aktualisiert: November 2007

Fehlermeldung

Der Lambda-Ausdruck wird nicht aus diesem Ereignishandler entfernt. Weisen Sie den Lambda-Ausdruck einer Variablen zu, und verwenden Sie die Variable, um das Ereignis hinzuzufügen und zu entfernen.
Lambda expression will not be removed from this event handler. Assign the lambda expression to a variable and use the variable to add and remove the event.

Wenn Lambda-Ausdrücke zusammen mit Ereignishandlern verwendet werden, entspricht das dargestellte Verhalten möglicherweise nicht den Erwartungen. Der Compiler generiert für jede Definition eines Lambda-Ausdrucks eine neue Methode, auch wenn sie identisch sind. Daher zeigt der folgende Code False an.

Module Module1

    Sub Main()
        Dim fun1 As ChangeInteger = Function(p As Integer) p + 1
        Dim fun2 As ChangeInteger = Function(p As Integer) p + 1
        Console.WriteLine(fun1 = fun2)
    End Sub

    Delegate Function ChangeInteger(ByVal x As Integer) As Integer

End Module

Wenn Lambda-Ausdrücke zusammen mit Ereignishandlern verwendet werden, kann dies zu unerwarteten Ergebnissen führen. Im folgenden Beispiel wird der durch AddHandler hinzugefügte Lambda-Ausdruck nicht durch die RemoveHandler-Anweisung entfernt.

Module Module1

    Event ProcessInteger(ByVal x As Integer)

    Sub Main()

        ' The following line adds one listener to the event.
        AddHandler ProcessInteger, Function(m As Integer) m

        ' The following statement searches the current listeners 
        ' for a match to remove. However, this lambda is not the same
        ' as the previous one, so nothing is removed.
        RemoveHandler ProcessInteger, Function(m As Integer) m

    End Sub
End Module

Standardmäßig ist diese Meldung eine Warnung. Weitere Informationen zum Ausblenden von Warnungen bzw. zur Behandlung von Warnungen als Fehler finden Sie unter Konfigurieren von Warnungen in Visual Basic.

Fehler-ID: BC42326

So beheben Sie diesen Fehler

  • Um die Warnung zu vermeiden und den Lambda-Ausdruck zu entfernen, weisen Sie den Lambda-Ausdruck einer Variablen zu, und verwenden Sie die Variable sowohl in der AddHandler-Anweisung als auch in der RemoveHandler-Anweisung, wie im folgenden Beispiel gezeigt.

    Module Module1
    
        Event ProcessInteger(ByVal x As Integer)
    
        Dim PrintHandler As ProcessIntegerEventHandler
    
        Sub Main()
    
            ' Assign the lambda expression to a variable.
            PrintHandler = Function(m As Integer) m
    
            ' Use the variable to add the listener.
            AddHandler ProcessInteger, PrintHandler
    
            ' Use the variable again when you want to remove the listener.
            RemoveHandler ProcessInteger, PrintHandler
    
        End Sub
    End Module
    

Siehe auch

Konzepte

Lambda-Ausdrücke

Gelockerte Delegatenkonvertierung

Ereignisse und Ereignishandler