L'espressione lambda non verrà rimossa da questo gestore eventi

Aggiornamento: novembre 2007

Messaggio di errore

L'espressione lambda non verrà rimossa da questo gestore eventi. Assegnare l'espressione lambda a una variabile e utilizzare la variabile per aggiungere e rimuovere l'evento.
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.

Quando le espressioni lambda vengono utilizzate con i gestori eventi, è possibile non vedere il comportamento previsto. Il compilatore genera un nuovo metodo per ogni definizione dell'espressione lambda, anche se sono identiche. Pertanto, nel codice seguente verrà visualizzato False.

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

Quando le espressioni lambda vengono utilizzate con i gestori eventi, è possibile che vengano restituiti risultati imprevisti. Nell'esempio seguente l'espressione lambda aggiunta da AddHandler non viene rimossa dall'istruzione RemoveHandler.

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

Per impostazione predefinita, si tratta di un messaggio di avviso. Per ulteriori informazioni su come nascondere gli avvisi o considerarli come errori, vedere Configurazione degli avvisi in Visual Basic.

ID errore: BC42326

Per correggere l'errore

  • Per evitare la visualizzazione dell'avviso e rimuovere l'espressione lambda, assegnare l'espressione lambda a una variabile e utilizzare la variabile nelle istruzioni AddHandler e RemoveHandler, come mostrato nell'esempio seguente.

    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
    

Vedere anche

Concetti

Espressioni lambda

Conversione di tipo relaxed del delegato

Eventi e gestori eventi