添加(T对象)不是IEnumerable <T>的合同方法 - 为什么?

Gra*_*ton 1 c# ienumerable

令我感到奇怪的是,任何继承的类IEnumerable<T>都不需要实现Add(T object),即使你想在初始化类实例时使用集合初始化器,你也必须实现Add(T object).

为什么会这样?

Jon*_*eet 6

IEnumerable<T> 是一个只读接口 - 它只是代表"一个序列".

集合初始化程序需要Add才能工作,但是它们首先检查类型是否实现IEnumerable,以确保它确实是某些描述的集合类型.它们不需要通用形式,因为这对于某些2.0之前的代码(特别是各种UI集合不实现IEnumerable<T>IIRC)具有限制性,并且它们不需要特定的 Add签名,因为集合初始化器可以使用不同数量的参数.例如,Dictionary<TKey, TValue>Add(TKey value, TValue value)这样您就可以使用:

var dictionary = new Dictionary<string, int>
{
    { "Jon", 33 },
    { "Tom", 6 }
};
Run Code Online (Sandbox Code Playgroud)

这意味着它不能仅限于(比如)IList只有单argumnet Add方法.它在某种程度上需要鸭子打字,但IEnumerable要求是试图确保Add真正意味着"将一个项目添加到集合"而不是完全不同的东西.编译器不使用它实现的事实IEnumerable- 例如,它GetEnumerator在构建集合时从不调用.