Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet avertissement se produit lorsque vous utilisez AddressOf une méthode dans un contexte de gestionnaire d’événements où la signature de méthode ne correspond pas exactement à la signature déléguée de l’événement. Visual Basic permet une conversion de délégué détendue dans ces scénarios, mais l’opérateur devient redondant, car le AddressOf compilateur doit créer un délégué wrapper de toute façon.
Comprendre la conversion de délégué détendue
Visual Basic vous permet d’affecter des méthodes à des délégués même si leurs signatures ne correspondent pas exactement, tant que la conversion est sécurisée. Il s’agit de la conversion de délégué détendue et inclut :
- Types de paramètres étendus : un paramètre de méthode peut être un type plus large que le paramètre délégué.
- Types de retour étendus : un type de retour de méthode peut être plus étroit que le type de retour délégué.
- Paramètres omis : une méthode peut avoir moins de paramètres que le délégué.
-
Valeurs de retour supprimées : une fonction peut être affectée à un
Subdélégué.
Lorsque cet avertissement se produit
Cet avertissement s’affiche lorsque Visual Basic peut gérer l’affectation par le biais d’une conversion détendue, ce qui rend l’affectation inutile explicite AddressOf .
Exemple complet montrant l’avertissement
L’exemple suivant montre un scénario qui produit BC42328 :
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
Lorsque vous compilez ce code, Visual Basic affiche l’avertissement BC42328 pour les AddHandler instructions qui utilisent la conversion de délégué détendue.
Pourquoi AddressOf semble avoir « aucun effet »
Le message d’avertissement indique que AddressOf « n’a aucun effet », car Visual Basic doit créer un délégué wrapper pour la conversion détendue, indépendamment. L’opérateur AddressOf ne change pas la façon dont le compilateur gère la conversion : le même résultat se produit si vous utilisez AddressOf ou non dans des scénarios de conversion détendus.
Toutefois, AddressOf il est toujours nécessaire de façon syntactique dans et AddHandler dans RemoveHandler les instructions.
ID d’erreur : BC42328
Pour corriger cette erreur
Vous avez plusieurs options en fonction de vos besoins. À l’aide de l’exemple DocumentProcessor précédent, voici les différentes façons de résoudre l’avertissement BC42328 :
Option 1 : Affecter d’abord à une variable (conserve la sémantique exacte)
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 : Mettre en correspondance exactement la signature du délégué
' 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 : Utiliser une expression lambda
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 : Utiliser la Handles clause (le cas échéant)
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 : Affectation directe à la variable déléguée
Public Sub DemonstrateHandler()
' Assign to delegate variable then use with AddHandler
Dim handler As EventHandler = AddressOf OnDocumentProcessed_Simple
AddHandler DocumentProcessed, handler
End Sub
Quand vous pouvez ignorer cet avertissement
Cet avertissement est souvent sûr d’ignorer quand :
- Votre méthode de gestionnaire omet intentionnellement les paramètres dont elle n’a pas besoin.
- Vous utilisez une signature de méthode plus simple pour du code plus propre.
- L’impact sur les performances est négligeable pour votre application.
- Vous prototypageez ou écrivez du code utilitaire rapide où la clarté importe plus que l’efficacité.
La conversion détendue fonctionne correctement ; cet avertissement indique simplement une considération mineure en matière d’efficacité. Le compilateur crée automatiquement un délégué wrapper, ce qui ajoute une petite surcharge de performances, mais n’affecte pas les fonctionnalités.
Exemple de cas où l'ignorance est appropriée
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