28 votes

Initialiseurs de collection personnalisés

Les classes qui implémentent IEnumerable et fournissent une fonction public void Add(/* args */) peuvent être initialisées comme dans l'exemple suivant:

 List<int> numbers = new List<int>{ 1, 2, 3 };
 

qui appelle la fonction Add(int) 3x après avoir initialisé le List<int> .

Existe-t-il un moyen de définir explicitement ce comportement pour mes propres classes? Par exemple, pourrais-je demander à l'initialiseur d'appeler une fonction autre que la surcharge Add() appropriée?

39voto

Mehrdad Afshari Points 204872

Non, le compilateur nécessite une méthode nommée Add pour la collecte de l'initialiseur de travail. Ceci est défini dans la spécification C# et ne peut pas être changé:

Spécification Du Langage C# - 7.5.10.3 Initialiseurs De La Collection

L'objet de collection à laquelle un initialiseur de collection est appliqué doit être d'un type qui implémente System.Collections.IEnumerable ou une erreur de compilation se produit. Pour chaque élément spécifié dans l'ordre, l'initialiseur de collection invoque un Add méthode sur l'objet cible avec la liste d'expression de l'élément de l'initialiseur comme argument la liste, l'application normale de la résolution de surcharge pour chaque invocation. Ainsi, l'objet de collection doit contenir une autorisation d' Add méthode pour chaque élément de l'initialiseur. [c'est moi qui souligne]

Bien sûr, l' Add méthode peut prendre plus d'un argument (comme Dictionary<TKey, TValue>):

dic = new Dictionary<int, int> { 
    { 1, 2 },
    { 3, 4 }
};
// translated to:
dic = new Dictionary<int, int>();
dic.Add(1, 2);
dic.Add(3, 4);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X