6

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

void CopyTo(
    Array array,
    int index)

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

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

这与 ICollection.CopyTo 的通用版本的签名相同。我的困惑来自这样一个事实,即通用队列似乎没有实现通用的 ICollection,而是实现了标准的 ICollection。那么这里到底发生了什么?

4

3 回答 3

9

根据文档

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

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

不要让名称的相似性欺骗了你——ICollection它们ICollection<T>是完全独立的接口,虽然这样的事情(实现一些通用接口但只实现非通用的其他接口)是不寻常的,但它是完全合法的。

我怀疑ICollection<T>设计师确实不想支持的各个方面Queue<T>,但同样他们希望实施ICollection以允许人们轻松地从非泛型Queue类升级。

编辑:如丹尼斯的回答中所述,ICollection.CopyToQueue<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,但AddRemove的方法ICollection<T>不存在 - 相反,您应该使用EnqueueDequeue值。

于 2012-10-10T19:20:35.657 回答
4

根据 MSDN 文档: http: //msdn.microsoft.com/en-us/library/7977ey2c.aspx,Queue有自己的 CopyTo() 实现,并明确实现 ICollection.CopyTo()

于 2012-10-10T19:25:46.093 回答
2

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

于 2012-10-10T19:32:47.493 回答