为什么集合初始化表达式需要实现IEnumerable?

时间:2010-09-15 10:08:45

标签: c# syntax language-design

为什么会产生编译器错误:

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}的接口的类的原因是什么方法哪个没用?

1 个答案:

答案 0 :(得分:24)

对象初始化程序没有;一个集合初始化程序。这样它就可以应用于真正代表集合的类,而不仅仅是具有Add方法的任意类。我必须承认,我经常明确地“实现”IEnumerable,只是为了允许集合初始化程序 - 但是从NotImplementedException抛出GetEnumerator()

请注意,在C#3开发的早期阶段,集合初始化程序必须实现ICollection<T>,但发现它过于严格。 Mads Torgersen blogged about this change以及需要IEnumerable背后的原因,早在2006年。