Partilhar via


Expressão lambda não será removido do manipulador de eventos

Mensagem de erro

Expressão lambda não será removido desta evento manipulador.atribuir a expressão lambda a uma variável e use a variável para adicionar e remover o evento.

Quando as expressões lambda são usadas com evento manipuladores, você pode não ver o comportamento esperado.O compilador gera um novo método para cada definição de expressão lambda, mesmo que sejam idênticos.Portanto, o código a seguir exibe 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 as expressões lambda são usadas com manipuladores de eventos, isso pode causar resultados inesperados.No exemplo a seguir, a expressão lambda adicionada por AddHandler não é removido pela RemoveHandler demonstrativo.

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

Por padrão, essa é uma mensagem de aviso.Para obter mais informações sobre como ocultar avisos ou tratar avisos como erros, consulte Configurando Avisos (Warnings) no Visual Basic.

ID de erro: BC42326

Para corrigir este erro

  • Para evitar o aviso e remover a expressão lambda, atribua a expressão lambda a uma variável e use a variável no AddHandler e RemoveHandler instruções, sistema autônomo mostrado no exemplo a seguir.

    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
    

Consulte também

Conceitos

Expressões Lambda

Conversão de delegado reduzida

Eventos e manipuladores de eventos