Queue <t>实际实现了什么</t>

时间:2012-10-10 19:18:09

标签: c# .net c#-4.0

在尝试通过包装通用队列来实现我自己的队列时,我注意到Queue实现了ICollection。但是,ICollection.CopyTo的方法签名如下

void CopyTo(
    Array array,
    int index)

而通用Queue.CopyTo的方法签名是

public void CopyTo(
    T[] array, 
    int arrayIndex)

这与ICollection.CopyTo的通用版本的签名相同。我的困惑来自于通用队列似乎没有实现通用ICollection,而是实现标准ICollection。那究竟发生了什么?

3 个答案:

答案 0 :(得分:9)

根据the documentation

public class Queue<T> : IEnumerable<T>, ICollection, IEnumerable

因此它实现了泛型 IEnumerable<T>接口,但是非泛型 ICollection接口。

不要让名字的相似性欺骗你 - ICollectionICollection<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, 0, queue.Count); // Compilation failure...
ICollection collection = (ICollection) queue;
collection.CopyTo(array, 0, queue.Count); // Compiles, but will go bang

采用强类型数组 的方法有效实现ICollection<T>.CopyTo,但Add的{​​{1}}和Remove方法不是' t present - 相反,您的意思是ICollection<T>Enqueue值。

答案 1 :(得分:4)

根据MSDN文档,

Queue有自己的CopyTo()实现,显式实现ICollection.CopyTo():http://msdn.microsoft.com/en-us/library/7977ey2c.aspx

答案 2 :(得分:2)

因为ICollection<T>包含Remove方法,可以从集合中的任何位置删除项目 。这不适用于队列,因为您只能删除顶部项目而不重建整个队列。