c# – 为什么核心类型只部分实现接口?

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

相关文章

文章浏览阅读6.2k次,点赞2次,收藏3次。C#数学运算表达式解...
文章浏览阅读5.2k次,点赞6次,收藏7次。程序要做到用户配置...
文章浏览阅读9k次。错误信息检测到 ContextSwitchDeadlock M...
文章浏览阅读2w次,点赞10次,收藏9次。我发生错误时的环境:...
文章浏览阅读9.8k次。C# 二进制字节流查找函数IndexOf ...
文章浏览阅读2.5w次,点赞3次,收藏9次。c#DataGridView数据...