为什么会产生编译器错误:
class X { public void Add(string str) { Console.WriteLine(str); } }
static class Program
{
static void Main()
{
// error CS1922: Cannot initialize type 'X' with a collection initializer
// because it does not implement 'System.Collections.IEnumerable'
var x = new X { "string" };
}
}
但这不是:
class X : IEnumerable
{
public void Add(string str) { Console.WriteLine(str); }
IEnumerator IEnumerable.GetEnumerator()
{
// Try to blow up horribly!
throw new NotImplementedException();
}
}
static class Program
{
static void Main()
{
// prints “string” and doesn’t throw
var x = new X { "string" };
}
}
将集合初始化程序(对于调用Add
方法的语法糖)限制为实现不 {{1}的接口的类的原因是什么方法哪个没用?
答案 0 :(得分:24)
对象初始化程序没有;一个集合初始化程序。这样它就可以应用于真正代表集合的类,而不仅仅是具有Add
方法的任意类。我必须承认,我经常明确地“实现”IEnumerable
,只是为了允许集合初始化程序 - 但是从NotImplementedException
抛出GetEnumerator()
。
请注意,在C#3开发的早期阶段,集合初始化程序必须实现ICollection<T>
,但发现它过于严格。 Mads Torgersen blogged about this change以及需要IEnumerable
背后的原因,早在2006年。