Secondo the documentation:
public class Queue<T> : IEnumerable<T>, ICollection, IEnumerable
Così implementa l'interfaccia generica IEnumerable<T>
, ma l'interfaccia non genericoICollection
.
Non lasciate che la somiglianza dei nomi ingannare - ICollection
e ICollection<T>
sono completamente interfacce separate, e mentre qualcosa di simile (attuazione di alcune interfacce generiche ma solo non generici altre interfacce) è insolito, è del tutto legittimo.
ho il sospetto che ci sono stati vari aspetti della ICollection<T>
cui i progettisti davvero non volevano sostenere nel Queue<T>
, ma ugualmente hanno voluto implementare ICollection
per consentire alle persone di eseguire l'aggiornamento dalla Queue
classe non generico in modo indolore.
MODIFICA: come indicato nella risposta di Dennis, ICollection.CopyTo
è implementato esplicitamente in Queue<T>
. Ciò significa che è possibile solo ottenere quella firma tramite un'espressione di tipo ICollection
. Per esempio:
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
Il metodo di prendere una matrice tipizzata sarebbe valida per implementare ICollection<T>.CopyTo
, ma le Add
e Remove
metodi di ICollection<T>
non sono presenti -, invece, sei destinato a Enqueue
e Dequeue
valori .
fonte
2012-10-10 19:20:35
possibile duplicato di [C# Stack Implements ICollection, ma ha metodi da ICollection] (http://stackoverflow.com/questions/10589803/c-sharp-stack-implements-icollection-but-has-methods-from- icollectiont) –
nawfal