2016-03-01 24 views
3

我注意到在c#中的數組實現了ICollection<T>。數組如何實現一個通用的容器接口,但它本身不是通用的?我們可以這樣做嗎?數組與C#中的通用數組#

編輯:我也想知道數組是多麼的不通用的,但它接受任何類型,且類型安全。

public class ListOfStrings : IList<string> 
{ 
... 
} 

這是一個很好的例子,表明我們可以從泛型創建非泛型(謝謝MarcinJuraszek !!)。這個集合會被卡在字符串中。我的猜測是,它與字符串的泛型值聲明無關,並且是我不熟悉的一些內部接線。

再次感謝您!

+0

數組已經是通用的 - int []定義了一個int類型的數組。因爲它是一個內置的類型,我會想象有一些語法糖基本上是'陣列'(請注意,雖然,'Array'是'[]'不同 - 它僅僅是一個例子),這使得完整意義上 – Rob

+0

這將會真正幫助我在未來考慮到這一點! int []〜Array Maderas

回答

6

是的,這是完全可能的。你可以聲明是這樣的:

public class MyListOfStrings : IList<string> 
{ 
} 

只要你實現所有的屬性/方法IList<string>需要你的一切將工作得很好。正如你所見,MyListOfStrings不是通用的。

你也應該記住,數組是特殊的類型,並有東西要去與他們,這不是與普通用戶定義的類型發生了一堆。有些是在MSDN描述,這似乎與你的問題的一部分是在這裏:

與.NET Framework 2.0開始,Array類實現System.Collections.Generic.IList<T>System.Collections.Generic.ICollection<T>System.Collections.Generic.IEnumerable<T>通用接口。這些實現在運行時提供給數組,因此通用接口不會出現在Array類的聲明語法中。另外,只有通過將數組轉換爲通用接口類型(顯式接口實現)才能訪問的接口成員沒有參考主題。將數組轉換爲這些接口之一時要注意的關鍵是要添加,插入或移除元素的成員拋出NotSupportedException

正如你可以看到Array實現IList<T>,以特殊的方式ICollection<T>IEnumerable<T>,這是不是你可以用自己的類型做。

+1

我不熟悉這裏的禮儀。我想澄清一下我的問題,但我不希望它看起來好像你沒有回答我的問題。我只是進行編輯還是要問這裏?這是一個關於數組接受任何類型的想法的問題,但您的MyListOfStrings只接受字符串。他們是如何使數組非通用但接受任何類型的?感謝編輯,順便說一句。 – Maderas

+1

隨意更新您的問題與澄清。 – MarcinJuraszek

+0

@RyanWoods通常,如果編輯使現有答案無效,最好在評論中澄清(假設它是一個小改動),或發佈一個新問題。但請注意,不斷澄清評論中的問題是被忽視的 - 在這一點上應該是一個新問題。 – Rob