C#中的数组与通用

Mad*_*ras 3 c# arrays generics icollection

我注意到c#中的数组实现了ICollection<T>.数组如何实现通用容器接口,但本身不是通用的?我们可以这样做吗?

编辑:我也想知道数组是如何通用的,但它接受任何类型并具有类型安全性.

public class ListOfStrings : IList<string>
{
...
}
Run Code Online (Sandbox Code Playgroud)

这是一个很好的例子,表明我们可以从泛型创建非泛型(谢谢MarcinJuraszek !!).这个集合会被字符串困住.我的猜测是它与字符串的泛型值类型声明无关,而且是我不熟悉的一些内部连线.

再次感谢你!

Mar*_*zek 6

是的,这完全有可能.你可以声明这样的东西:

public class MyListOfStrings : IList<string>
{
}
Run Code Online (Sandbox Code Playgroud)

并且只要你实现所有的属性/方法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>以一种特殊的方式,这不是你可以用你自己的类型做的事情.