2010-09-17 8 views
3

Le code suivant compile et s'exécute correctement.Quelle est la syntaxe correcte pour cette utilisation de MethodInvoker?

void myInvokedMethod(string s) 
{ 
    Console.WriteLine(s); 
} 

void myInvoker() 
{ 
    Invoke(new MethodInvoker(delegate() { myInvokedMethod("one"); })); 
    Invoke(new MethodInvoker(delegate { myInvokedMethod("two"); })); 
} 

Quand j'appelle myInvoker, les appels à myInvokedMethod passer à travers. Que signifient les parenthèses après délégué, et pourquoi apparaissent-elles optionnelles?

Répondre

3

Les parenthèses sont appelées liste des paramètres de la méthode anonyme et sont vides dans ce cas. La méthode anonyme n'a pas de type - le compilateur essaie d'effectuer une conversion implicite. Si la signature de la méthode anonyme est donnée, elle doit correspondre à la signature du délégué.

conversion implicite est également possible si les conditions suivantes tous attente:

  • La liste de paramètres formels du délégué est omis
  • Le délégué n'a pas des paramètres
  • Les types de retour correspondent

C'est le cas dans votre deuxième exemple. Il n'y a donc pas de différence entre ces deux lignes - les deux font la même chose. Voici un autre exemple:

var x1 = new ParameterizedThreadStart(delegate(object o) {}); // Compiles. 
var x2 = new ParameterizedThreadStart(delegate {});   // Compiles. 
var x3 = new ParameterizedThreadStart(delegate() {});   // Does not compile. 

Les deux derniers exemples montrent que delegate(){} et delegate{} ne sont pas équivalentes en général. Ils sont seulement équivalents dans votre cas car MethodInvoker ne prend aucun paramètre. Voir la section des spécifications C# 21 pour plus de détails et d'autres exemples.

3

Ils spécifient les paramètres formels pris par le anonymous method, et ils sont facultatifs s'il n'en prend aucun. S'il est déclaré sans liste de paramètres, il peut être affecté à un type de délégué qui prend des paramètres.

Questions connexes