2013-05-15 2 views
3

Pourquoi le compilateur C# n'est-il pas perturbé par les méthodes qui ont des arguments par défaut?Pourquoi le compilateur C# n'est-il pas perturbé par les méthodes qui ont des arguments par défaut?

Dans le code ci-dessous SayHello() peut se référer à:

  • SayHello()
  • SayHello (chaîne arg1 = null)
  • SayHello (chaîne arg1 = null, string arg2 = null)
  • SayHello (chaîne arg1 = null, chaîne arg2 = null, chaîne arg3 = null)

Mais ce code compile avec succès sans toute erreur ambiguë.

class Program 
{ 
    private static void SayHello() 
    { 
     Console.WriteLine("Hello 1"); 
     return; 
    } 

    private static void SayHello(string arg1 = null) 
    { 
     Console.WriteLine("Hello 2"); 
     return; 
    } 

    private static void SayHello(string arg1 = null, string arg2 = null) 
    { 
     Console.WriteLine("Hello 3"); 
     return; 
    } 

    private static void SayHello(string arg1 = null, string arg2 = null, string arg3 = null) 
    { 
     Console.WriteLine("Hello 3"); 
     return; 
    } 

    private static void Main(string[] args) 
    { 
     SayHello(); // SayHello() invoked, but SayHello(string arg1 = null) not invoked. 
     SayHello("arg1"); 
     SayHello("arg1", "arg2", "arg3"); 

     // Output is: 
     // Hello 1 
     // Hello 2 
     // Hello 3 

     return; 
    } 
} 
+2

Je ne comprends pas ce que vous demandez ici. Demandez-vous quelle section de la spécification de langage décrit les règles pour résoudre ces ambiguïtés? Parce que la réponse à la question que vous avez posée est "parce que les personnes qui ont conçu la langue et écrit le compilateur ont soigneusement examiné tous ces cas et ont choisi des règles qui mènent à des résultats raisonnables." Quoi d'autre serait la réponse? –

Répondre

9

Le compilateur choisira d'abord la méthode sans paramètre optionnel. Par conséquent, il n'y a aucune ambiguïté dans votre code en ce qui concerne le compilateur.

4

Le compilateur a des règles détaillées (here) pour choisir la bonne surcharge

6

Pourquoi le compilateur C# ne confondez pas sur les méthodes qui ont des arguments par défaut?

Cette question ne répond pas. Une question à répondre est:

Quelle section de la spécification de langage C# dois-je lire si je veux comprendre comment la résolution de surcharge traite les arguments par défaut?

Obtenez une copie de la spécification C# 4; vous pouvez le télécharger ou acheter la version papier annotée. Les sections que vous voulez lire sont 7.5.1 "Liste d'arguments", et 7.5.3 "Résolution de surcharge". Voir en particulier la section 7.5.3.2 "Meilleur membre fonctionnel".

La ligne exacte qui décrit le comportement que vous voyez est:

Si tous les paramètres de Mp ont un argument correspondant alors que les arguments par défaut doivent être remplacés par au moins un paramètre facultatif dans Mq, puis Mp est mieux que Mq.

Questions connexes