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.