Freigeben über


Der Ausdruck "AddressOf" hat in diesem Kontext keine Auswirkung, da das Methodenargument zu "AddressOf" eine entspannte Konvertierung in den Delegattyp des Ereignisses erfordert.

Diese Warnung tritt auf, wenn Sie mit einer Methode in einem Ereignishandlerkontext verwenden AddressOf , bei dem die Methodensignatur nicht exakt mit der Stellvertretungssignatur des Ereignisses übereinstimmt. Visual Basic ermöglicht eine entspannte Stellvertretungskonvertierung in diesen Szenarien, der AddressOf Operator wird jedoch redundant, da der Compiler trotzdem einen Wrapperdelegat erstellen muss.

Verstehen der entspannten Stellvertretungskonvertierung

Mit Visual Basic können Sie Stellvertretungen Methoden zuweisen, auch wenn ihre Signaturen nicht exakt übereinstimmen, solange die Konvertierung sicher ist. Dies wird als entspannter Delegatkonvertierung bezeichnet und umfasst:

  • Erweiterte Parametertypen: Ein Methodenparameter kann ein breiterer Typ sein als der Delegatparameter.
  • Verbreiterte Rückgabetypen: Ein Methodenrückgabetyp kann schmaler als der Rückgabetyp des Delegaten sein.
  • Ausgelassene Parameter: Eine Methode kann weniger Parameter als der Delegat haben.
  • Verworfene Rückgabewerte: Einer Stellvertretung kann eine Sub Funktion zugewiesen werden.

Wenn diese Warnung auftritt

Diese Warnung wird angezeigt, wenn Visual Basic die Zuweisung durch eine entspannte Konvertierung verarbeiten kann, wodurch die explizite AddressOf unnötig wird.

Vollständiges Beispiel mit der Warnung

Das folgende Beispiel zeigt ein Szenario, das BC42328 erzeugt:

Public Class DocumentProcessor
    ' Standard .NET event using EventHandler
    Public Event DocumentProcessed As EventHandler
    
    ' Custom event with different signature
    Public Event StatusChanged As Action(Of String)
    
    ' Handlers with different signatures
    
    ' Exact match for EventHandler - no warning
    Private Sub OnDocumentProcessed_Exact(sender As Object, e As EventArgs)
        Console.WriteLine("Document processed (exact signature)")
    End Sub
    
    ' Simplified handler - causes BC42328 with EventHandler
    Private Sub OnDocumentProcessed_Simple()
        Console.WriteLine("Document processed (simple)")
    End Sub
    
    ' Handler for custom event - exact match
    Private Sub OnStatusChanged_Exact(message As String)
        Console.WriteLine($"Status: {message}")
    End Sub
    
    ' Handler with ignored parameters - causes BC42328 with custom event
    Private Sub OnStatusChanged_Simple()
        Console.WriteLine("Status changed")
    End Sub
    
    Public Sub DemonstrateWarnings()
        Console.WriteLine("Setting up event handlers...")
        
        ' These work without warnings (exact matches)
        AddHandler DocumentProcessed, AddressOf OnDocumentProcessed_Exact
        AddHandler StatusChanged, AddressOf OnStatusChanged_Exact
        
        ' These generate BC42328 warnings (relaxed conversions)
        AddHandler DocumentProcessed, AddressOf OnDocumentProcessed_Simple
        AddHandler StatusChanged, AddressOf OnStatusChanged_Simple
        
        ' Fire the events
        RaiseEvent DocumentProcessed(Me, EventArgs.Empty)
        RaiseEvent StatusChanged("Processing complete")
    End Sub
    
    Public Sub DemonstrateSolutions()
        Console.WriteLine("Using solutions to avoid warnings...")
        
        ' Solution 1: Assign to variable first
        Dim handler1 As EventHandler = AddressOf OnDocumentProcessed_Simple
        AddHandler DocumentProcessed, handler1
        
        ' Solution 2: Use lambda expression
        AddHandler DocumentProcessed, Sub(s, e) OnDocumentProcessed_Simple()
        
        ' Solution 3: Direct assignment to delegate variable
        Dim handler2 As Action(Of String) = AddressOf OnStatusChanged_Simple
        AddHandler StatusChanged, handler2
        
        ' Fire the events
        RaiseEvent DocumentProcessed(Me, EventArgs.Empty)
        RaiseEvent StatusChanged("All solutions work")
    End Sub
End Class

Wenn Sie diesen Code kompilieren, zeigt Visual Basic die Warnung BC42328 für die AddHandler Anweisungen an, die eine entspannte Delegatenkonvertierung verwenden.

Warum AddressOf "keine Auswirkung" hat

Die Warnmeldung gibt an, dass "keine Auswirkung" vorliegt, AddressOf da Visual Basic unabhängig von der entspannten Konvertierung einen Wrapperdelegat erstellen muss. Der AddressOf Operator ändert nicht, wie der Compiler die Konvertierung verarbeitet: Dasselbe Ergebnis tritt auf, ob Sie in entspannten Konvertierungsszenarien verwenden AddressOf oder nicht.

AddressOf Es ist jedoch immer noch syntaktisch erforderlich in AddHandler und RemoveHandler Anweisungen.

Fehler-ID: BC42328

So beheben Sie diesen Fehler

Je nach Ihren Anforderungen stehen Ihnen mehrere Optionen zur Auswahl. DocumentProcessor Im Beispiel von zuvor sind die verschiedenen Methoden zum Beheben der BC42328 Warnung aufgeführt:

Option 1: Zuweisen zu einer Variablen zuerst (behält genaue Semantik bei)

Public Sub DemonstrateHandler()
    ' Create delegate variable first - this eliminates the warning
    Dim handler As EventHandler = AddressOf OnDocumentProcessed_Simple
    AddHandler DocumentProcessed, handler
End Sub

Option 2: Genau der Delegatsignatur entsprechen

' Change the method signature to match EventHandler exactly
Private Sub OnDocumentProcessed_Simple(sender As Object, e As EventArgs)
    ' You can ignore the parameters if you don't need them
    Console.WriteLine("Document processed (simple)")
End Sub

Public Sub DemonstrateHandler()
    ' Now this works without warning
    AddHandler DocumentProcessed, AddressOf OnDocumentProcessed_Simple
End Sub

Option 3: Verwenden eines Lambda-Ausdrucks

Public Sub DemonstrateHandler()
    ' Wrap the method call in a lambda that matches the signature
    AddHandler DocumentProcessed, Sub(sender, e) OnDocumentProcessed_Simple()
    
    ' Or create a more complex lambda inline
    AddHandler DocumentProcessed, 
        Sub(sender, e) 
            Console.WriteLine($"Event from {sender}")
            OnDocumentProcessed_Simple()
        End Sub
End Sub

Option 4: Verwenden Sie die Handles Klausel (falls zutreffend)

Public Class DocumentHandler
    ' Declare the event source with WithEvents
    Private WithEvents processor As DocumentProcessor
    
    ' Use Handles clause - no AddHandler needed
    Private Sub OnDocumentComplete() Handles processor.DocumentProcessed
        Console.WriteLine("Document processing is done!")
    End Sub
End Class

Option 5: Direkte Zuweisung zur Stellvertretungsvariable

Public Sub DemonstrateHandler()
    ' Assign to delegate variable then use with AddHandler
    Dim handler As EventHandler = AddressOf OnDocumentProcessed_Simple
    AddHandler DocumentProcessed, handler
End Sub

Wenn Sie diese Warnung ignorieren können

Diese Warnung kann häufig ignoriert werden, wenn:

  • Die Handlermethode lässt absichtlich Parameter aus, die nicht benötigt werden.
  • Sie verwenden eine einfachere Methodensignatur für saubereren Code.
  • Die Leistungsauswirkungen sind für Ihre Anwendung gering.
  • Sie erstellen Prototypen oder schreiben Schnellprogrammcode, bei dem Klarheit wichtiger als Effizienz ist.

Die entspannte Konvertierung funktioniert richtig; Diese Warnung weist lediglich auf eine geringfügige Effizienzüberlegung hin. Der Compiler erstellt automatisch einen Wrapperdelegat, der einen geringen Leistungsaufwand hinzufügt, sich jedoch nicht auf die Funktionalität auswirkt.

Beispiel, wann das Ignorieren angemessen ist

Public Class QuickLogger
    Public Event LogMessage As Action(Of String, DateTime)
    
    ' Simple handler that ignores the timestamp parameter
    Private Sub WriteToConsole()
        Console.WriteLine("Something was logged")
    End Sub
    
    Public Sub SetupLogging()
        ' This generates BC42328, but it's fine for simple scenarios
        AddHandler LogMessage, AddressOf WriteToConsole
    End Sub
End Class

Siehe auch