Según the documentation:
public class Queue<T> : IEnumerable<T>, ICollection, IEnumerable
Así que implementa la interfaz genérica IEnumerable<T>
, pero la interfaz no genérico ICollection
.
No dejes que la similitud de los nombres te engañe - ICollection
y ICollection<T>
son interfaces completamente separadas, y aunque algo como esto (implementando algunas interfaces genéricas pero otras interfaces no genéricas) es inusual, es completamente legítimo.
sospecho que hubo varios aspectos de ICollection<T>
la que los diseñadores realmente no quieren apoyar en Queue<T>
, pero igualmente se desea implementar ICollection
para permitir a la gente a la actualización de la clase no genérica Queue
sin dolor.
EDITAR: Como se señala en la respuesta de Dennis, ICollection.CopyTo
se implementa explícitamente en Queue<T>
. Esto significa que puede solo llegar a esa firma mediante una expresión del tipo ICollection
. Por ejemplo:
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
El método de tomar una matriz fuertemente tipado que sea válida para implementar ICollection<T>.CopyTo
, pero los Add
Remove
y métodos de ICollection<T>
no están presentes - en su lugar, que está destinado a Enqueue
y Dequeue
valores .
posible duplicado de [C# Stack Implements ICollection, pero tiene métodos de ICollection] (http://stackoverflow.com/questions/10589803/c-sharp-stack-implements-icollection-but-has-methods-from- icollectiont) –
nawfal