c# - 为什么核心类型只实现了部分接口(interface)?

标签 c# .net collections interface

Q1 为什么 .NET 中的新类仅部分实现接口(interface)?

Q2 我应该在我的代码中做同样的事情吗?

我问了这个问题here ,所以我想,好吧,那是很久以前的事了,你可以有不同的用法等等,现在支持这种实现只是出于一致性的原因。但新类(class)也能做到这一点。

int[] list = new int[] {};
IList iList = (IList)list;
ilist.Add(1); //exception here

ICollection c = new ConcurrentQueue<int>();
var root = c.SyncRoot; //exception here

更新

我不担心为什么我得到异常,很明显。但是我不明白为什么实现定义明确的契约,而不是所有成员(这会导致令人不快的运行时异常)?

最佳答案

您可能会争辩说原始设计中的界面不够细化。例如,大多数人从不使用 SyncRoot - 它可能在不同的界面上。同样,不幸的是,例如,没有接口(interface)提供只读索引器访问。

就目前而言,界面就是它们的样子。实现main还是很方便的IList[<T>]/ICollection[<T>]/IEnumerable[<T>]虽然接口(interface) - 它为大多数调用者提供了访问他们需要的东西的权限......所以第一个示例中的索引器Add在第二个。

公平地说,他们也提供 IsFixedSizeIsReadOnly - 查询第一个会导致您不调用 Add .回复 SyncRoot - 这在 ConcurrentQueue<T> 内部可能没有意义,任何实现都会破坏类型的逻辑。通常我会说“那么它不是那种类型;不要实现接口(interface)”,但要重复我之前的声明……大多数人从不使用 SyncRoot - 所以我同意 ;p

关于c# - 为什么核心类型只实现了部分接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6071093/

相关文章:

c# - 为什么我向 MySqlParameter 传递参数时得到 "You have an error in your SQL Syntax"?

c# - 什么是NullReferenceException,如何解决?

.net - 是什么原因导致 .NET ToolTip 无法再次工作?

c# - 在类初始值设定项中使用隐式类型数组

java - "{}"是什么意思?什么时候 map 是空的?

c# - 在 LINQPad 中引用同一程序集的两个不同版本

c# - FileStream 返回长度 = 0

c# - WP7 Mango - 建筑物内导航

c# - 计算带锁和不带锁的线程 (c#)

java - TreeSet 只加一个值?