Initialiseurs de collection personnalisés

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

 List numbers = new List{ 1, 2, 3 }; 

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

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

Non, le compilateur nécessite une méthode nommée Add pour que l’initialiseur de collection fonctionne. Ceci est défini dans la spécification C # et ne peut pas être modifié:

Spécification du langage C # – 7.5.10.3 Initialiseurs de collection

L’object de collection auquel 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 appelle une méthode Add sur l’object cible avec la liste d’expressions de l’initialiseur d’élément en tant que liste d’arguments, en appliquant une résolution de surcharge normale pour chaque appel. Ainsi, l’object de collection doit contenir une méthode Add applicable pour chaque initialiseur d’élément. [emphase la mienne]

Bien entendu, la méthode Add peut prendre plus d’un argument (comme Dictionary ):

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

Ajouter juste comme exemple de réponse de ce qui fonctionne. AFAIK, seul Ajouter fonctionnera. Extrait de code extrait de Marius Schulz

 // simple struct which represents a point in three-dimensional space public struct Point3D { public readonly double X; public readonly double Y; public readonly double Z; public Point3D(double x, double y, double z) { X = x; Y = y; Z = z; } } // implementation of a collection of points, which respects // the comstackr convention for collection initializers and // therefore both implements IEnumerable and provides // a public Add method public class Points : IEnumerable { private readonly List _points; public Points() { _points = new List(); } public void Add(double x, double y, double z) { _points.Add(new Point3D(x, y, z)); } public IEnumerator GetEnumerator() { return _points.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } // instantiate the Points class and fill it with values like this: var cube = new Points { { -1, -1, -1 }, { -1, -1, 1 }, { -1, 1, -1 }, { -1, 1, 1 }, { 1, -1, -1 }, { 1, -1, 1 }, { 1, 1, -1 }, { 1, 1, 1 } };