Поделиться через


Лямбда-выражение не будет удалено из этого обработчика событий

Обновлен: Ноябрь 2007

Сообщение об ошибке

Лямбда-выражение не удаляется из этого обработчика событий. Назначьте лямбда-выражение переменной и используйте ее для добавления и удаления события.
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.

Если лямбда-выражение используется вместе с обработчиками событий, ожидаемое поведение может не наблюдаться. Для каждого определения лямбда-выражения компилятор создает новый метод, даже если они идентичны. Поэтому следующий код отображает 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

Использование лямбда-выражений вместе с обработчиками событий может привести к непредвиденным результатам. В приведенном ниже примере лямбда-выражение, добавленное с помощью 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

По умолчанию это сообщение является предупреждающим. Сведения о том, как скрыть предупреждения или как рассматривать предупреждения как ошибки, см. в разделе Настройка предупреждений в Visual Basic.

Идентификатор ошибки: BC42326

Исправление этой ошибки

  • Чтобы избежать появления предупреждающего сообщения и удалить лямбда-выражение, назначьте его переменной и используйте последнюю в операторах AddHandler и RemoveHandler, как показано в примере ниже.

    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
    

См. также

Основные понятия

Лямбда-выражения

Ослабленное преобразование делегата

События и обработчики событий