加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么ICollection不包含Add方法?

发布时间:2020-12-15 17:14:48 所属栏目:百科 来源:网络整理
导读:在标题中,有人知道为什么ICollection接口不包含Add方法吗?通用版本ICollection T有一个Add但ICollection没有,这似乎很奇怪.任何对此有深入了解的人都会非常有帮助. 至于为什么我关心 – 遗憾的是构建SharePoint的开发人员从未学过泛型,因此API中的每个集合
在标题中,有人知道为什么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("");

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读