为什么ICollection不包含Add方法?

在标题中,有没有人知道为什么ICollection接口不包含Add方法? 似乎很奇怪的是,通用版本ICollection<T>具有AddICollection不具有。 任何对此有深入了解的人都会很有帮助。

至于我为什么关心 - 不幸的是,构建SharePoint的开发人员从未学过泛型,因此API中的每个集合都是基于ICollection非泛型集合。 我想附加几个扩展方法ICollection ,其中包括添加到集合,但这似乎是不可能的(至少不可能没有反思)。

编辑:

不少人正在猜测原因是因为ICollection.Add需要一个Object ,因此不会是类型安全的。 情况并非如此。 IList有一个接受ObjectAdd方法。 您只需在采用Object的方法中进行类型检查和强制转换。

数组实现ICollection并因此它不能具有Add也不成立。 如果ICollection有一个Add方法,它只需要在数组上显式实现并抛出一个Exception(就像当前许多方法数组所实现的那样)。

我真的希望有人提到一位设计师的解释。


对我来说,接口的命名看起来令人困惑。 ICollectionICollection<T>甚至不在同一个继承链中 - 大多数集合都只是简单地实现了两者。

该文档说明界面的功能,因此单独考虑这一点,不会指望Add to exist:

为所有非通用集合定义大小,枚举数和同步方法。

我怎么想? 就我个人而言,我认为它可能是直接命名gaff或第二次(当引入通用接口时),设计人员选择将AddICollection<T>因为这次更常见。

IList具有Add和继承ICollectionIList<T>不具有Add并继承ICollection<T> ,它作为Add

把它归结为类型层次设计的发展/成熟。


至于扩展方法,您可以执行如下操作:

public static void AnotherMethod<T>(this ICollection<T> collection, T item) { }

并如此使用它:

ICollection<string> s;
s.AnotherMethod("");

ICollection可以是任何东西。 它可能只是可以枚举的东西。 没有理由应该有一个Add方法,或者实际上是一个Remove 。 如果您更仔细地查看界面,它几乎是只读的。 你可以看到有多少元素,你可以枚举它们。 而已。 这是一种抽象的方式,非常有意义。

当我们进入ICollection<T> ,我们现在非常具体。 我们确切知道它拥有什么样的对象,因此我们可以:

  • 添加<T>新元素。
  • 使用IEquitable类型的接口搜索它们。
  • 使用相同的方法删除它们。
  • 本质上,区别在于ICollection<T>有些具体。


    来自MSDN

    当使用多态方式代替其他集合或集合接口时,不需要将集合类型添加到已知类型。 例如,如果声明一个IEnumerable类型的数据成员并使用它来发送ArrayList的实例,则不需要将ArrayList添加到已知类型。

    当您以多种方式使用集合来代替非集合类型时,它们必须添加到已知类型中。 例如,如果您声明Object类型的数据成员并使用它来发送ArrayList的实例,请将ArrayList添加到已知类型。

    链接地址: http://www.djcxy.com/p/11037.html

    上一篇: Why does ICollection not contain an Add method?

    下一篇: Overwrite a line in a file using node.js