2011-09-17 26 views
0

爲什麼T[]在C#中代表數組而不是IEnumerable<T>T []代表數組,爲什麼不是IEnumerable <T>?

我知道泛型是在.NET 2.0中引入的。如果它是從頭開始設計的,將[]映射到數組是否有意義?積極使用LINQ擴展方法,我寧願寫簡單的T[]而不是笨重的IEnumerable<T>或顯式的.ToArray()

我想知道只是出於學術的原因。

+0

Java,C++,C中的T []是什麼? –

+0

爲什麼我們使用圓括號進行函數調用?這就是這樣......在這裏。 –

+0

'IEnumerable '不是'T []'。他們是不同的東西。一個是接口,另一個是內置類型(數組)。請注意'IEnumerable '不*支持索引,而數組呢。你可能會認爲你可以完全從語言中刪除數組,因爲你有'List '。我敢肯定,有表現頭腦的人會抗議,壽:) –

回答

2

T[]是靜態類型C語言數組的標準語法。如果.NET 1.0具有泛型,則數組可能使用了Array<T>類型。

無論如何,如果T[]用於IEnumerable<T>它只能在聲明中使用,並且您將無法使用new T[] { ... }創建一個。就接口而言,將它映射到IList<T>會更有意義,因爲方括號表示索引。

+0

而集合是可以修改的。 –

+0

從技術上講,如果編譯器願意幫助(例如,它可能會爲您創建一個「Array '或某個其他」特殊「類型的對象),那麼您無法編寫該代碼。你正在寫lambda表達式。當然,這並不是一個好主意。 – Jon

+0

.net和C#中的許多頑疾都可追溯到.net 1.0沒有泛型的事實;進一步的量可追溯到通用接口最初不支持協方差或逆變的事實。在支持下標的最小標準接口(即IList )中,荒謬的東西不僅給實施者帶來頭痛 - 它還意味着沒有標準協變接口可以通過下標讀取項目。當然,如果我有我的幹事,那麼對於任何類型的不可變數組也將有一個預定義的「基元」,而不僅僅是'char'。 – supercat

相關問題