2012-07-17 2 views
2

J'ai un délégué et un événement avec un paramètre sur:Gestion déléguée avec le paramètre sur

public delegate vide ExampleDelegate (expéditeur d'objet, EventArgs e, en valeur de chaîne);

événement public ExampleDelegate Exemple;

Quand je suis en train de gérer l'événement:

mg.Example += (sender, e, val) => 
{ 
    //do stuff 
}; 

Je reçois l'erreur paramètre 3 doit être déclarée avec le « out » mot-clé

Quand je suis jetant dans le mot-clé suggéré comme:

mg.Example += (sender, e, out val) => 
{ 
    //do stuff 
}; 

Je reçois et erreur supplémentaire le type de nom d'espace de noms 'val' n'a pas pu être trouvé..etc

Qu'est-ce que je fais mal?

+4

Vous cassez la conception du gestionnaire d'événements. Créez votre propre classe EventArgs à la place. –

+1

@AmiramKorach votre réponse est celle que je cherchais –

Répondre

2

Votre gestionnaire d'événements ne confirme pas les directives de .net.

Si vous devez l'utiliser comme cela, utilisez un délégué, pas un événement.

Vous rencontreriez des problèmes si vous aviez deux gestionnaires d'événements modifiant votre paramètre out.

Reportez-vous: Events Tutorial

.NET Framework Directives

Bien que le langage C# permet des événements d'utiliser tout type de délégué, le .NET Framework a des directives plus strictes sur les types de délégués que devrait être utilisé pour les événements. Si vous avez l'intention d'utiliser votre composant avec le .NET Framework, vous voudrez probablement suivre ces directives .

Les lignes directrices du .NET Framework indiquent que le type de délégué utilisé pour un événement doit prendre deux paramètres, un paramètre « source d'objet » indiquant la source de l'événement, et un paramètre « e » qui encapsule toute information complémentaire à propos de l'événement. Le type de le paramètre "e" doit dériver de la classe EventArgs. Pour les événements qui n'utilisent aucune information supplémentaire, le .NET Framework a déjà défini un type de délégué approprié: EventHandler.

zmbq vous a déjà donné la réponse à la façon de corriger votre erreur.

J'ajoute ceci juste pour l'exhaustivité.

+0

Merci, j'apprécie –

4

Eh bien, comme il est dit clairement here, vous devez spécifier le type de val:

(sender, e, out string val)=> ... 
+0

Une note sur la réponse à laquelle vous liez indique que vous devez spécifier les types pour * tous * les paramètres. –

+0

Cela semble le faire. –

Questions connexes