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

标签 c# .net api-design

<分区>

正如标题,有谁知道为什么ICollection接口(interface)不包含 Add 方法?通用版本似乎很奇怪,ICollection<T> , 有一个 Add但是ICollection才不是。任何对此有更深入了解的人都会非常有帮助。

至于我为什么关心 - 不幸的是,构建 SharePoint 的开发人员从未了解过泛型,因此 API 中的每个集合都是基于 ICollection 的非泛型集合。 .我想将几个扩展方法附加到 ICollection这涉及到添加到集合中等等,但这似乎是不可能的(至少在没有反射(reflection)的情况下是不可能的)。

编辑:

很多人推测原因是因为ICollection.Add需要 Object ,因此不会是类型安全的。事实并非如此。 IList 一个Add采用 Object 的方法.您只需要在采用 Object 的方法中进行类型检查和强制转换。 .

数组实现的参数ICollection因此它不能有 Add也不装水。如果ICollection有一个Add方法,它只需要在数组上显式实现并抛出异常(正如当前数组实现的许多方法所做的那样)。

我真的希望有人能引用其中一位设计师的解释。

最佳答案

对我来说,接口(interface)的命名似乎混淆了预期。 ICollectionICollection<T>甚至不在同一个继承链中 - 大多数集合只是简单地实现两者。

文档说明了接口(interface)的作用,因此单独考虑这一点,人们不会期望 Add存在:

Defines size, enumerators, and synchronization methods for all nongeneric collections.

我怎么看?我个人认为这要么是直接的命名错误,要么是设计师第二次(在引入通用接口(interface)时)选择放置 Add。在 ICollection<T>因为这次更需要它。

IListAdd并继承ICollectionIList<T>没有 Add并继承ICollection<T> ,即 Add .

将其归因于类型层次结构设计的演变/成熟。


至于扩展方法,你可以这样做:

public static void AnotherMethod<T>(this ICollection<T> collection, T item) { }

这样使用它:

ICollection<string> s;
s.AnotherMethod("");

关于c# - 为什么 ICollection 不包含 Add 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11690147/

相关文章:

c# - ExcelDataReader 在某些情况下不读取 xls 文件

json - 是否可以使用 nginx 合并两个 json 响应?

ruby-on-rails - API 设计 - json_api 不返回数据的最佳实践

c# - 在 Spreadsheetlight 中选择范围

c# - 如何更改默认的 "Sorry, my bot code is having an issue"异常消息?

javascript - 在 signalR 核心启动时设置自定义 ID

c# - 通过反射获取当前的MethodBase

c# - WPF 绑定(bind)用户娱乐

c# - 为 QA/DEV 调用单独的 C# 类?

java - 同一方法的两个版本仅在其签名(方法名称和 'throws' 属性)上有所不同是否被认为是糟糕的设计?