2009-12-22 7 views
2

J'ai deux méthodes avec les signatures suivantesUtilisation des délégués en tant que paramètres

void Invoke(Action method) 
void Foo() 

Quelle est la différence entre les deux lignes de code ci-dessous?

Invoke(new Action(Foo)); 

et

Invoke(Foo); 

et est la deuxième ligne autorisée?

Merci

+0

vous pourriez vouloir formater votre exemple un peu mieux. Rien de mal, juste pour des raisons de clarté. Rappelez-vous que si une question est claire et bien posée, les gens seront plus enclins à y répondre. Beauté aide également (formatage, etc). – lorenzog

+0

Correction: la première méthode devrait se lire comme suit void Invoke (méthode d'action) Maintenant, les deux lignes vont compiler, mais quelle est la différence entre elles? Merci – Exulted

Répondre

2

Votre signature est "Invoke (méthode Delegate)" (D majuscule), n'est-ce pas? Seule la première ligne construisant l'action fonctionne explicitement. La raison derrière ceci: Delegate est la classe de base pour tous les délégués. Il représente un délégué avec une valeur de retour inconnue et un nombre inconnu et le type de paramètres. Vous ne pouvez l'appeler qu'avec DynamicInvoke.

Ainsi, le compilateur ne sait pas quel type de délégué utiliser pour transmettre un nom de méthode: "Invoke (Foo);". Ce pourrait être une action, mais aussi un autre délégué avec la même signature que Foo.

Cependant, si vous créez explicitement le délégué, il peut être implicitement converti en Délégué et, par conséquent, le code est compilé.

+0

ouais c'est exactement ce que je tapais :) Je pense qu'il vaut la peine d'expliquer comment vous savez qu'il est destiné à être «délégué»? –

+0

Bien - si vous utilisez "delegate" au lieu de "Delegate" dans la liste de paramètres d'une méthode, cela entraînera cinq erreurs de compilation comme "delegate" est un mot-clé spécial pour définir les délégués et pour les méthodes anonymes. – Matthias

+0

Après la dernière édition (la signature est "void Invoke (méthode Action)") Maximilian Mayerl a raison. – Matthias

3

Pourquoi ne pas l'essayer?

Si la signature de votre méthode est

void Invoke(Action objAction) 

il est légal. Et puis les 2 appels sont les mêmes. La fonctionnalité pour cela est appelée "conversion de groupe de méthode implicite".

Questions connexes