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