使用扩展方法进行集合初始化

当实例化任何实现 IEnumerable 的类并且具有名为 Add 的方法时,可以使用集合初始化语法,该方法采用单个参数。

在以前的版本中,此 Add 方法必须是要初始化的类的实例方法。在 C#6 中,它也可以是扩展方法。

public class CollectionWithAdd : IEnumerable
{
    public void Add<T>(T item)
    {
        Console.WriteLine("Item added with instance add method: " + item);
    }

    public IEnumerator GetEnumerator()
    {
        // Some implementation here
    }
}

public class CollectionWithoutAdd : IEnumerable
{
    public IEnumerator GetEnumerator()
    {
        // Some implementation here
    }
}

public static class Extensions
{
    public static void Add<T>(this CollectionWithoutAdd collection, T item)
    {
        Console.WriteLine("Item added with extension add method: " + item);
    }
}

public class Program
{
    public static void Main()
    {
        var collection1 = new CollectionWithAdd{1,2,3}; // Valid in all C# versions
        var collection2 = new CollectionWithoutAdd{4,5,6}; // Valid only since C# 6
    }
}

这将输出:

使用实例添加方法添加的
项目 :1 添加实例添加方法的
项目 :2 添加实例添加方法的
项目 :3 项目添加扩展名添加方法:4
项目添加扩展名添加方法:5
项目添加扩展名添加方法:6