我注意到在c#中,该数组实现了ICollection<T>
。数组如何实现通用容器接口,而不是通用本身?我们可以这样做吗?
编辑:我也想知道数组不是通用的,但它可以接受任何类型并具有类型安全性。
public class ListOfStrings : IList<string>
{
...
}
这是一个很好的例子,说明我们可以从泛型中创建非泛型(谢谢MarcinJuraszek!)。该集合将被字符串卡住。我的猜测是,它与字符串的通用值类型声明无关,并且是我不熟悉的一些内部连线。
再次感谢你!
最佳答案
是的,这完全有可能。您可以这样声明:
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>
,这是您无法使用自己的类型实现的。