自定义集合初始化器

Jak*_*ake 48 c#

可以像以下示例中那样初始化实现IEnumerable和提供public void Add(/* args */)函数的类:

List<int> numbers = new List<int>{ 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

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

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

Meh*_*ari 66

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

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

应用集合初始值设定项的集合对象必须是实现的类型System.Collections.IEnumerable或发生编译时错误.对于按顺序的每个指定元素,集合初始值设定项调用Add目标对象上的方法,并将元素初始值设定项的表达式列表作为参数列表,为每个调用应用正常的重载决策.因此,集合对象必须包含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);
Run Code Online (Sandbox Code Playgroud)

  • 我本可以发誓它也必须是一种公共方法 - 但看起来我错了.现在我将不得不修复我在今天审查的深度C#:( (12认同)