我注意到在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>,这是您无法使用自己的类型实现的。

09-25 18:03
查看更多