C#中的数组与泛型有何区别?

4
我注意到在C#中,数组实现了ICollection<T>。如何实现一个通用容器接口却不是通用的?我们能做到同样的吗?
编辑:我还想知道数组如何不是通用的,但又接受任何类型并具有类型安全性。
public class ListOfStrings : IList<string>
{
...
}

这是一个很好的例子,展示了我们可以从通用类型中创建非通用类型(感谢MarcinJuraszek!)。这个集合将被限制为字符串。我猜这与字符串的通用值类型声明无关,而是一些我不熟悉的内部布线问题。
再次感谢!

1
数组已经是一种通用类型 - int[] 定义了一个 int 类型的数组。由于它是内置类型,我想象中有一些符号糖语法来表示本质上是 Array<int>(注意,Array[] 不同 - 它只是一个示例)。 - Rob
这非常有道理,这将真正帮助我在未来考虑这个问题!int[] ~ Array<int> - Maderas
1个回答

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
1
@RyanWoods 一般来说,如果编辑使现有答案无效,最好在评论中澄清(假设这是一个小改变),或者发布一个新问题。但要注意,不断在评论中澄清问题是被看作不好的行为 - 这时应该发布一个新问题。 - Rob
我是否遗漏了什么,或者在4.6.1中,数组不仅实现了非泛型版本的IList、ICollection等接口吗?http://referencesource.microsoft.com/#mscorlib/system/array.cs - Simon C
谢谢你的回答。下次我会先看MSDN。我要说,我不会像你一样从MSDN上获取这个信息。你的解释让它更有意义。在你、MarcinJuraszek和Rob之间,我对这个主题有了更好的理解。谢谢。 - Maderas
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接