Udostępnij za pośrednictwem


BC42326: wyrażenie lambda nie zostanie usunięte z tej procedury obsługi zdarzeń

Wyrażenie lambda nie zostanie usunięte z tej procedury obsługi zdarzeń. Przypisz wyrażenie lambda do zmiennej i użyj zmiennej , aby dodać i usunąć zdarzenie.

Gdy wyrażenia lambda są używane z procedurami obsługi zdarzeń, może nie być widoczne oczekiwane zachowanie. Kompilator generuje nową metodę dla każdej definicji wyrażenia lambda, nawet jeśli są identyczne. W związku z tym poniższy kod wyświetla wartość 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

Gdy wyrażenia lambda są używane z procedurami obsługi zdarzeń, może to spowodować nieoczekiwane wyniki. W poniższym przykładzie wyrażenie lambda dodane przez AddHandler element nie jest usuwane przez instrukcję 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

Domyślnie ten komunikat jest ostrzeżeniem. Aby uzyskać więcej informacji na temat ukrywania ostrzeżeń lub traktowania ostrzeżeń jako błędów, zobacz Konfigurowanie ostrzeżeń w Visual Basic.

Identyfikator błędu: BC42326

Aby naprawić ten błąd

Aby uniknąć ostrzeżenia i usunąć wyrażenie lambda, przypisz wyrażenie lambda do zmiennej i użyj zmiennej w instrukcjach AddHandler i RemoveHandler , jak pokazano w poniższym przykładzie.

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

Zobacz także