2012-10-10 13 views
6

Durante il tentativo di implementare la mia coda accorpando la coda generica, ho notato che Queue implementa ICollection. Tuttavia, la firma del metodo di ICollection.CopyTo è il seguenteCosa fa in realtà la Queue

void CopyTo(
    Array array, 
    int index) 

considerando che la firma del metodo del Queue.CopyTo generica è

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

Questa è la stessa della firma della versione generica di ICollection .Copia a. La mia confusione deriva dal fatto che la coda generica non sembra implementare il generico ICollection, ma implementa invece lo standard ICollection. Quindi, cosa sta succedendo esattamente qui?

+0

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

risposta

9

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 .

+1

[Accidenti, queste interfacce sono un mal di testa collettivo.] (http://tvtropes.org/pmwiki/pmwiki.php/Main/IncrediblyLamePun) – BoltClock

+0

@BoltClock: Sì.Io enumererei le difficoltà, ma sono troppo pigro. –

+1

Questa è una bella risposta, ma * solo * risponde al * titolo * della domanda. La risposta alla domanda sulle due diverse firme è data in [risposta di Dennis Traub] (http://stackoverflow.com/a/12826832/1106367). – Adam

2

Perché ICollection<T> contiene un metodo Remove che rimuove un elemento da qualsiasi luogo in la collezione. Questo non è applicabile a una coda poiché è possibile rimuovere solo l'elemento principale senza ricostruire l'intera coda.

Problemi correlati