2016-03-01 25 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