为什么'IList< T>'从IReadOnlyList< T>继承?

人气:950 发布:2022-09-21 标签: .net c# generics .net-4.5

问题描述

当在.NET 4.5中引入 IReadOnlyList< T> 时,我认为这个谜题的缺失部分最终被插入到位:一种通过真正的只读可索引接口,以前我不得不使用我自己的只读接口,并且围绕一切创建包装类。

我期望接口放置在自然的层次结构,理想的情况是:

  IEnumerable< T>  .GetEnumerator()  - > IReadOnlyCollection< T> :IEnumerable< T>  .Count   - > IReadOnlyList< T> :IReadOnlyCollection< T> 。项目[...]   - >的IList< T> :IReadOnlyList< T>  .Add(...) .Clear() .Contains(...)(etc)  

但事实证明, IList< T> 不会从 IReadOnlyList< T>

是否有原因?

解决方案

@wb将链接指向新界面IReadOnlyList和IReadOnlyDictionary 在包含答案的评论中:

为什么我们不改变现有接口来扩展只读接口?

它看起来像是一个合理的假设,因为只读接口纯粹是读写接口的子集。不幸的是,它是不兼容的,因为在元数据级别上,每个接口上的每个方法都有自己的插槽(这使得显式接口实现可以工作)。

216