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

前端之家收集整理的这篇文章主要介绍了c# – 为什么ICollection不包含Add方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
标题中,有人知道为什么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("");

猜你在找的C#相关文章