2012-10-10 3 views
6

일반 큐를 래핑하여 내 자신의 큐를 구현하는 동안 Queue는 ICollection을 구현하는 것으로 나타났습니다. 일반 Queue.CopyTo의 방법 서명무엇 큐 <T> 실제로 구현합니까

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

이것은 ICollection에의 일반 버전의 서명과 동일하다 반면 그러나 ICollection.CopyTo의 메소드 서명

void CopyTo(
    Array array, 
    int index) 

을 다음과 같다 .에게 복사. 일반적인 대기열은 일반 ICollection을 구현하지 않는 대신 표준 ICollection을 구현한다는 사실에서 혼란스러워합니다. 그럼 여기서 정확히 무슨 일이 일어나고있는거야?

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

그래서는 일반적인IEnumerable<T> 인터페이스를 구현하지만, 제네릭이 아닌ICollection 인터페이스 :

+0

가능한 복제본 [C# Stack ICllection을 구현하지만 ICollection 의 메서드가 있음] (http://stackoverflow.com/questions/10589803/c-sharp-stack-implements-icollection-but-has-methods-from- icollectiont) – nawfal

답변

9
the documentation 당으로

.

바보 같은 이름의 유사성 (ICollectionICollection<T>)이 완전히 별개의 인터페이스가 아니며 일부 일반 인터페이스 만 구현하지만 일반 인터페이스가 아닌 일반 인터페이스는 예외적 인 반면 일반적이지는 않지만 완전히 합법적입니다.

나는 거기에 디자이너 정말Queue<T>에서 지원 싶지 않았다 ICollection<T>의 다양한 측면이 있었다, 그러나 동등 그들은 사람들이 고통이 아닌 일반적인 Queue 클래스에서 업그레이드 할 수 있도록 ICollection을 구현하고 싶다고 생각한다.

편집 : Dennis의 답변에서 언급했듯이 ICollection.CopyToQueue<T>에 명시 적으로 구현됩니다. 즉, ICollection이라는 표현식을 통해 해당 서명을 얻을 수 있습니다. - 대신, 당신은 EnqueueDequeue 값을 의미하고

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을 구현하는,하지만 ICollection<T>AddRemove 방법이 존재하지 않습니다 : 예를 들어, .

+1

[어머,이 인터페이스는 집단적인 두통입니다.] (http://tvtropes.org/pmwiki/pmwiki.php/Main/IncrediblyLamePun) – BoltClock

+0

@BoltClock : 예.나는 어려움을 열거하지만, 나는 너무 게으르다. –

+1

좋은 답변이지만 문제의 * 제목 * 만 대답합니다. 두 가지 다른 서명에 대한 질문에 대한 대답은 [Dennis Traub의 답변] (http://stackoverflow.com/a/12826832/1106367)에 나와 있습니다. – Adam

2

때문에 ICollection<T> 어떤 장소에서 항목 을 제거하는 Remove 방법을 포함 컬렉션. 전체 대기열을 다시 작성하지 않고 맨 위 항목 만 제거 할 수 있기 때문에 대기열에는 적용 할 수 없습니다.