为什么核心类型仅部分实现接口?

ole*_*sii 7 .net c# collections interface

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

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

在这里问了这个问题,所以我想,好吧很久以前,你可以有不同的用法等等,现在这种实现只是出于一致性的原因而受到支持.但新课程也是如此.

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

ICollection c = new ConcurrentQueue<int>();
var root = c.SyncRoot; //exception here
Run Code Online (Sandbox Code Playgroud)

UPDATE

我不担心为什么我得到例外,很明显.但我不明白为什么实现明确定义的合同,而不是所有成员(这可能导致令人不快的运行时异常)?

Mar*_*ell 4

您可能会说原始设计中的界面不够精细。例如,大多数人从未使用过 SyncRoot- 它可能位于不同的界面上。同样,不幸的是没有接口提供只读索引器访问等。

就目前情况而言,接口就是它们的样子。尽管如此,实现主IList[<T>]//接口仍然非常方便 - 它为大多数调用者提供了对他们所需内容的访问......因此第一个示例和第二个示例中的索引ICollection[<T>]器。IEnumerable[<T>]Add

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