Compartir a través de


BC42326: la expresión lambda no se quitará de este controlador de eventos.

La expresión lambda no se quitará de este controlador de eventos. Asigne la expresión lambda a una variable y use la variable para agregar y quitar el evento.

Cuando se usan expresiones lambda con controladores de eventos, es posible que no vea el comportamiento esperado. El compilador genera un nuevo método para cada definición de expresión lambda, incluso si son idénticos. Por lo tanto, el código siguiente muestra 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

Cuando se usan expresiones lambda con controladores de eventos, esto puede provocar resultados inesperados. En el ejemplo siguiente, la instrucción no quita la expresión lambda agregada por AddHandler .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

De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar advertencias o tratar advertencias como errores, vea Configurar advertencias en Visual Basic.

Identificador de error: BC42326

Para corregir este error

Para evitar la advertencia y quitar la expresión lambda, asigne la expresión lambda a una variable y use la variable en las AddHandler instrucciones y RemoveHandler , como se muestra en el ejemplo siguiente.

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 también