本文主要是介绍CLR via C# 数组 所有数组都隐式实现IEnumerable,ICloneable和IList,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
许多方法都能操纵各种各样的集合对象,因为他们声明为允许获取IEnumerable,ICloneable和IList等参数。可将数组传递给这些方法,因为 System.Array 之所以实现这些非泛型接口,是因为这些接口将所有元素都视为 System.Object 。然而,最好是让 System.Array 实现这些接口的泛型形式,提供更好的编译时类型安全性和更好的性能。
不过,由于涉及多维数组和非0基数组的问题,CLR团队不希望 System.Array 实现 IEnumerable<T>,ICloneable<T>和IList<T>。若在 System.Array 上定义这些接口,就会为所有数组类型启用这些接口。所以,CLR没有这么做,而是刷了一个小花招;创建一维0基数组类型时,CLR自动使数组类型实现IEnumerable<T>,ICloneable<T>和IList<T>(T是数组元素的类型)。同时,还为数组类型的所有基类型实现这三个接口,只要它们是引用类型。
所以,如果执行以下代码:
那么当CLR 创建 FileStream[] 类型时,会自动为这个类型实现IEnumerable<FileStream>,ICloneable<FileStream>和IList<FileStream>接口。此外,FileStream[] 类型还会为基类型实现接口:IEnumerable<Stream>,IEnumerable<Object>,ICollection<Stream>,ICollection<Object>,IList<Stream>和IList<Object>。由于所有这些接口都有CLR自动实现,所以在存在这些接口的任何地方都可以使用 fileStreams 变量。以下任何方法:
注意,如果数组包含值类型的元素,数组类型不会为元素的基类型实现接口。例如,如果执行以下代码:
那么 DateTime[] 类型只会实现IEnumerable<DateTime>,ICollection<ICollection>和IList<DateTime>接口,不会为DateTime的基类型(包括System.ValueType和System.Object)实现这些泛型接口。这意味着dateTimes变量不能作为实参传给前面的M3方法。这是因为值类型的数组在内存中布局与引用类型的数组不同。
这篇关于CLR via C# 数组 所有数组都隐式实现IEnumerable,ICloneable和IList的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!