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