<分区>
正如标题,有谁知道为什么ICollection
接口(interface)不包含 Add 方法?通用版本似乎很奇怪,ICollection<T>
, 有一个 Add
但是ICollection
才不是。任何对此有更深入了解的人都会非常有帮助。
至于我为什么关心 - 不幸的是,构建 SharePoint 的开发人员从未了解过泛型,因此 API 中的每个集合都是基于 ICollection
的非泛型集合。 .我想将几个扩展方法附加到 ICollection
这涉及到添加到集合中等等,但这似乎是不可能的(至少在没有反射(reflection)的情况下是不可能的)。
编辑:
很多人推测原因是因为ICollection.Add
需要 Object
,因此不会是类型安全的。事实并非如此。 IList
有一个Add
采用 Object
的方法.您只需要在采用 Object
的方法中进行类型检查和强制转换。 .
数组实现的参数ICollection
因此它不能有 Add
也不装水。如果ICollection
有一个Add
方法,它只需要在数组上显式实现并抛出异常(正如当前数组实现的许多方法所做的那样)。
我真的希望有人能引用其中一位设计师的解释。
对我来说,接口(interface)的命名似乎混淆了预期。 ICollection
和 ICollection<T>
甚至不在同一个继承链中 - 大多数集合只是简单地实现两者。
文档说明了接口(interface)的作用,因此单独考虑这一点,人们不会期望 Add
存在:
Defines size, enumerators, and synchronization methods for all
nongeneric collections.
我怎么看?我个人认为这要么是直接的命名错误,要么是设计师第二次(在引入通用接口(interface)时)选择放置 Add
。在 ICollection<T>
因为这次更需要它。
IList
有Add
并继承ICollection
而 IList<T>
没有 Add
并继承ICollection<T>
,即 Add
.
将其归因于类型层次结构设计的演变/成熟。
至于扩展方法,你可以这样做:
public static void AnotherMethod<T>(this ICollection<T> collection, T item) { }
这样使用它:
ICollection<string> s;
s.AnotherMethod("");