在尝试通过包装通用队列来实现我自己的Queue时,我注意到Queue实现了ICollection.但是,ICollection.copyTo的方法签名如下
void copyTo( Array array,int index)
public void copyTo( T[] array,int arrayIndex)
这与ICollection.copyTo的通用版本的签名相同.我的困惑来自于通用队列似乎没有实现通用ICollection,而是实现标准ICollection.那到底是怎么回事?
解决方法
按照
the documentation:
public class Queue<T> : IEnumerable<T>,ICollection,IEnumerable
因此它实现了通用的IEnumerable< T>接口,但非通用的ICollection接口.
不要让名字的相似性欺骗你 – ICollection和ICollection< T>是完全独立的接口,虽然像这样(实现一些通用接口,但只有非通用的其他接口)是不寻常的,它是完全合法的.
我怀疑ICollection的各个方面< T>设计者真的不想在Queue< T>中支持,但同样他们想要实现ICollection以允许人们无痛地从非通用Queue
类升级.
编辑:如Dennis的回答所述,ICollection.CopyTo
在Queue< T>中明确实现.这意味着您只能通过ICollection类型的表达式获取该签名.例如:
Queue<string> queue = new Queue<string>(); Array array = new Button[10]; queue.copyTo(array,queue.Count); // Compilation failure... ICollection collection = (ICollection) queue; collection.copyTo(array,queue.Count); // Compiles,but will go bang
采用强类型数组的方法对于实现ICollection<T>.CopyTo
是有效的,但ICollection< T>的添加和删除方法是有效的.不存在 – 相反,你的意思是入队和出列价值.
原文地址:https://www.jb51.cc/csharp/98598.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。