根据文档:
public class Queue<T> : IEnumerable<T>, ICollection, IEnumerable
所以它实现了泛型 IEnumerable<T>
接口,但是非泛型 ICollection
接口。
不要让名称的相似性欺骗了你——ICollection
它们ICollection<T>
是完全独立的接口,虽然这样的事情(实现一些通用接口但只实现非通用的其他接口)是不寻常的,但它是完全合法的。
我怀疑ICollection<T>
设计师确实不想支持的各个方面Queue<T>
,但同样他们希望实施ICollection
以允许人们轻松地从非泛型Queue
类升级。
编辑:如丹尼斯的回答中所述,ICollection.CopyTo
在Queue<T>
. 这意味着您只能通过 type 的表达式获得该签名ICollection
。例如:
Queue<string> queue = new Queue<string>();
Array array = new Button[10];
queue.CopyTo(array, 0, queue.Count); // Compilation failure...
ICollection collection = (ICollection) queue;
collection.CopyTo(array, 0, queue.Count); // Compiles, but will go bang
采用强类型数组的方法对实现是有效的ICollection<T>.CopyTo
,但Add
和Remove
的方法ICollection<T>
不存在 - 相反,您应该使用Enqueue
和Dequeue
值。