Queue <T>实际实现了什么

Bor*_*ort 6 .net c# c#-4.0

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

void CopyTo(
    Array array,
    int index)
Run Code Online (Sandbox Code Playgroud)

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

public void CopyTo(
    T[] array, 
    int arrayIndex)
Run Code Online (Sandbox Code Playgroud)

这与ICollection.CopyTo的通用版本的签名相同.我的困惑来自于通用队列似乎没有实现通用ICollection,而是实现标准ICollection.那到底是怎么回事?

Jon*_*eet 9

根据文件:

public class Queue<T> : IEnumerable<T>, ICollection, IEnumerable
Run Code Online (Sandbox Code Playgroud)

所以它实现了通用 IEnumerable<T>接口,但是非通用 ICollection接口.

不要让名字的相似性欺骗你 - ICollection并且ICollection<T>是完全独立的接口,虽然像这样(实现一些通用接口但只有非通用的其他接口)是不寻常的,但这是完全合法的.

我怀疑ICollection<T>设计师真的不想支持的各个方面Queue<T>,但他们同样希望实现ICollection允许人们Queue无痛地从非通用类升级.

编辑:正如丹尼斯的回答所述,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
Run Code Online (Sandbox Code Playgroud)

服用强类型数组的方法是有效的实施ICollection<T>.CopyTo,但AddRemove方法ICollection<T>不存在-相反,你打算EnqueueDequeue值.