加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:02:29 所属栏目:百科 来源:网络整理
导读:Q1为什么.NET中的新类仅部分实现接口? Q2我在代码中也这样做吗? 我问了这个问题here,所以我想,好吧,很久以前,你可以有不同的用法等等,现在这种实现只是出于一致性原因而受支持.但新课程也是如此. 旧 int[] list = new int[] {};IList iList = (IList)list;
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读