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>設計者が実際には .NET でサポートしたくないさまざまな側面があったと思いますが、同様に、人々が非ジェネリッククラスから簡単にアップグレードできるようQueue<T>に実装したいと考えていました。ICollectionQueue

編集:デニスの回答に記載されているように、ICollection.CopyToで明示的に実装されていQueue<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 のドキュメントによると、キューには独自の CopyTo() 実装があり、明示的にICollection.CopyTo() を実装しています: http://msdn.microsoft.com/en-us/library/7977ey2c.aspx

于 2012-10-10T19:25:46.093 に答える
2

コレクション内の任意の場所からアイテムを削除するメソッドがICollection<T>含まれているためです。キュー全体を再構築せずに削除できるのは最上位のアイテムのみであるため、これはキューには適用されません。Remove

于 2012-10-10T19:32:47.493 に答える