c# - Queue<T> 实际实现了什么

标签 c# .net c#-4.0

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

void CopyTo(
    Array array,
    int index)

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

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

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

最佳答案

根据 the documentation :

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

因此它实现了通用 IEnumerable<T>接口(interface),但非通用 ICollection界面。

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

我怀疑 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

采用强类型数组的方法有效地实现 ICollection<T>.CopyTo ,但是 AddRemove ICollection<T> 的方法不存在 - 相反,你应该 EnqueueDequeue值(value)观。

关于c# - Queue<T> 实际实现了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12826715/

相关文章:

.net - 如何为我的 .NET MVC 项目(在 Azure 存储模拟器上)创建新的 CloudBlobContainer 实例?

sql - 使用 Dapper 将 SQL 查询转换为 IList<T>

asp.net - 使用数据表在 Radgrid 中显示图像

c# - 使 AsyncLocal 更改传播到调用函数

c# - 无法从程序集 `A` 加载类型 `Not.Containing.Type.A`

c# - 获取通用抽象类的属性名

c# - 如何区分致命和非致命的 .NET 异常

.net - 无法在自定义端口上打开 dockerized .net core api

c# - 测试类型是否是属性?

c# - .NET 4 中的自定义属性更改