2012-10-10 34 views
6

當試圖通過包裝通用隊列來實現我自己的隊列時,我注意到隊列實現了ICollection。然而,ICollection.CopyTo的方法簽名如下什麼是隊列<T>實際執行

void CopyTo(
    Array array, 
    int index) 

儘管通用Queue.CopyTo的方法簽名

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

這是一樣的ICollection的通用版簽名。複製到。我的困惑來自這樣一個事實,即通用隊列似乎沒有實現通用的ICollection,而是實現了標準的ICollection。那麼究竟發生了什麼?

+0

的可能重複的[C#堆棧實現ICollection的,但是具有自ICollection 方法](http://stackoverflow.com/questions/10589803/c-sharp-stack-implements-icollection-but-has-methods-from- icollectiont) – nawfal

回答

9

the documentation

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

所以它實現了通用IEnumerable<T>接口,但非通用ICollection接口。

不要讓名稱的相似性欺騙你 - ICollectionICollection<T>是完全獨立的接口,而像這樣的東西(實現一些通用接口但只有非通用的其他接口)是不尋常的,這是完全合法的。

我懷疑是有它的設計者真的不想在Queue<T>支持ICollection<T>各個方面,但同樣地,他們希望實施ICollection,讓人們從非通用類Queue無痛升級。

編輯:正如丹尼斯的回答中指出的,ICollection.CopyToQueue<T>中明確實施。這意味着您可以通過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,但ICollection<T>AddRemove方法是不存在的 - 相反,你註定要EnqueueDequeue值。

+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方法,從在任何地方刪除一個項收集。這不適用於隊列,因爲您只能刪除頂層項目而不重建整個隊列。