自定义集合初始化器

实现IEnumerable并提供一个public void Add(/* args */)函数的类可以被初始化,如下例所示:

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

它在初始化List<int>之后调用Add(int)函数3x。

有没有办法为我自己的类明确定义这种行为? 例如,我可以让初始化程序调用除适当的Add()重载之外的函数吗?

不,编译器需要一个名为Add的方法才能使集合初始值设定器正常工作。 这是在C#规范中定义的,不能更改:

C#语言规范 – 7.5.10.3集合初始化器

集合初始值设定项应用于的集合对象必须是实现System.Collections.IEnumerable的types,否则会发生编译时错误。 对于每个指定的元素,集合初始值设定项调用目标对象上的Add方法,将元素初始值设定项的expression式列表作为参数列表,为每个调用应用正常的重载parsing。 因此, 集合对象必须为每个元素初始值设定项包含一个适用的Add方法[强调我的]

当然, Add方法可以采用多个参数(如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); 

只是作为一个有效的样本答案添加。 AFAIK,只有添加将工作。 来自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 compiler convention for collection initializers and // therefore both implements IEnumerable<T> and provides // a public Add method public class Points : IEnumerable<Point3D> { private readonly List<Point3D> _points; public Points() { _points = new List<Point3D>(); } public void Add(double x, double y, double z) { _points.Add(new Point3D(x, y, z)); } public IEnumerator<Point3D> 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 } };