【发布时间】:2012-07-26 06:29:18
【问题描述】:
如标题所示,有谁知道为什么ICollection 接口不包含Add 方法?通用版本ICollection<T> 有一个Add 但ICollection 没有,这似乎很奇怪。任何对此有更深入了解的人都会非常有帮助。
至于我为什么关心 - 不幸的是,构建 SharePoint 的开发人员从未了解过泛型,因此 API 中的每个集合都是基于 ICollection 的非泛型集合。我想将几个扩展方法附加到 ICollection,其中包括添加到集合中,但这似乎是不可能的(至少在没有反射的情况下是不可能的)。
编辑:
很多人在推测原因是因为ICollection.Add 需要Object,因此不会是类型安全的。事实并非如此。 IList 有一个 Add 方法,它采用 Object。您只需在采用 Object 的方法中进行类型检查和强制转换。
数组实现ICollection,因此它不能有Add 的论点也不成立。如果ICollection 有一个Add 方法,它只需要在数组上显式实现并抛出一个异常(就像数组当前实现的许多方法一样)。
我真的希望有人参考其中一位设计师的解释。
【问题讨论】:
-
@MicahArmantrout,他说
ICollection<T>有,但ICollection没有。 -
@MicahArmantrout 您链接到通用版本。他已经说过通用版本有它。他在问为什么non-generic one 没有。
-
可能是因为
ICollection中的Add必须采用object,但在例如List<int>。 (您不能向List<int>添加任何对象)但是,IList具有Add(object),因此这个论点不太成立。原因可能是历史性的:这是它最初的制作方式,并且从未被认为值得做出如此重大的改变。 -
答案很简单……设计师不称职。将 Add 和 Remove 放在 IList 上而不放在 ICollection 上是没有逻辑意义的,并且试图将其合理化的 cmets 是荒谬的(尽管不像 PR 粗鲁和令人反感的反智主义那么荒谬)。幸运的是,他们对泛型类有所了解,但拙劣的 ICollection 意味着您无法编写对非列表(如 HashSet
和 Dictionary )进行操作的通用代码。
标签: c# .net api-design