2009-03-31 5 views
3

j'ai essayé le code suivant:C# et nombre variable de paramètres

class Program: ProgParent 
    { 

     public int Max(params int[] op) 
     { 
      return 0; 
     } 

     public int Max(int i, params int[] op) 
     { 
      return 1; 
     } 

     public int Max(int i, int j, params int[] op) 
     { 
      return 2; 
     } 

     public static void Main(string[] args) 
     { 
      System.Console.WriteLine((new Program()).Max(5, 6, 7, 8)); 
      System.Console.ReadKey(); 
     } 
    } 

Il exécute et utilise la fonction plus spécifique disponible. Mais le compilateur ne donne aucun avertissement ou erreur à ce sujet. Pourquoi?

+0

Votre code ne compile pas - les deux premières signatures de méthode sont identiques. Après avoir enlevé l'un d'eux, c'est bien. Pourquoi ne le serait-il pas? –

+0

Oui, c'était la version originale, je voulais juste ajouter une nouvelle méthode ici – Dutow

+0

votre code ne fait que très bien, après avoir supprimé la classe de base (classe Program au lieu de classe Program: ProgParent). Je ne sais pas où est ton problème? – Vimvq1987

Répondre

4

La spécification du langage C# dit:

Lors résolution de surcharge, une méthode avec un tableau de paramètres peut être applicable soit sous sa forme normale [à savoir passer un tableau] ou sa forme expansée [c.-à-d. passer un nombre variable de paramètres]. La forme développée d'une méthode est disponible uniquement si la forme normale de la méthode est pas disponible et que si une méthode avec la même signature que la forme développée est pas déjà déclaré dans le même type »

dans un (légèrement simplifiée) bref. Si la résolution de surcharge est ambigu, le compilateur choisit la surcharge non params

Je suppose que les motifs de cette décision (au lieu de rendre le code comme le vôtre illégal) comprennent:

  • Si votre méthode a la signature: void fn (objet params [] p), vous voulez avoir un moyen d'appeler le "formulaire normal" (en passant un objet []). Le compilateur doit donc gérer les cas ambigus de toute façon.
  • La création d'un tableau temporaire est beaucoup plus onéreuse qu'un appel de méthode. Vous pouvez donc créer des surcharges sans paramètres avec des paramètres 1,2,3 qui se comportent de la même manière mais qui sont plus efficaces. (par exemple, String.Format)
2

Ignorer les erreurs de construction (que je mets aux fautes de frappe) - quel avertissement vous attendez ou voulez? C'est trouver une surcharge correspondante et l'utiliser ...

Strictement parlant, je peux appeler différentes surcharges - en passant des tableaux, mais oui, l'utilisation n'est pas entièrement claire.

Sans les multiples params avec surcharge, ce modèle est utilisé massivement dans des choses comme string.Concat etc (qui étayera + pour les chaînes sous le capot).

+1

AVERTISSEMENT: votre code est correct! :) – leppie

Questions connexes