Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
SubFunktion 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