Q1为什么.NET中的新类仅部分实现接口?
Q2我在代码中也这样做吗?
我问了这个问题here,所以我想,好吧,很久以前,你可以有不同的用法等等,现在这种实现只是出于一致性原因而受支持.但新课程也是如此.
旧
int[] list = new int[] {}; IList iList = (IList)list; ilist.Add(1); //exception here
新
ICollection c = new ConcurrentQueue<int>(); var root = c.SyncRoot; //exception here
UPDATE
我不担心为什么我会得到例外,很明显.但我不明白为什么类实现明确定义的合同,而不是所有成员(这可能导致令人不快的运行时异常)?
解决方法
您可能会认为接口在原始设计中不够精细.例如,大多数人从不使用SyncRoot – 它可能已经在不同的界面上.同样,不幸的是,例如,没有接口提供只读索引器访问.
就目前而言,界面就是它们的本质.实现主IList [< T>] / ICollection [< T>] / IEnumerable [< T>]接口仍然非常方便 – 它为大多数呼叫者提供了他们所需要的访问权限……所以第一个例子中的索引器,第二个例子中的Add.
公平地说,他们也提供IsFixedSize和IsReadOnly – 查询第一个会导致你不要调用Add. Re SyncRoot – 在ConcurrentQueue< T>中可能没有意义,任何实现都会破坏该类型的逻辑.通常我会说“然后它不是那种类型;不要实现接口”,但重复我之前的陈述……大多数人从不使用SyncRoot – 所以我很好用它; p