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
在第二个。
公平地说,他们也提供 IsFixedSize
和 IsReadOnly
- 查询第一个会导致您不调用 Add
.回复 SyncRoot
- 这在 ConcurrentQueue<T>
内部可能没有意义,任何实现都会破坏类型的逻辑。通常我会说“那么它不是那种类型;不要实现接口(interface)”,但要重复我之前的声明……大多数人从不使用 SyncRoot
- 所以我同意 ;p
关于c# - 为什么核心类型只实现了部分接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6071093/