将数组投射到IEnumerable <T>
假设你有一个基本的Employee
类:
class Employee { public string Name; public int Years; public string Department; }
然后(在一个单独的类)我有下面的代码片段(我想我明白除了最后一个):
我相信下面的代码片段可以工作,因为数组initiliser创build一个Employee对象的数组,这个对象的types和被分配给的劳动力variables是一样的。
Employee[] workforceOne = new Employee[] { new Employee() { Name = "David", Years = 0, Department = "software" }, new Employee() { Name = "Dexter", Years = 3, Department = "software" }, new Employee() { Name = "Paul", Years = 4, Department = "software" } };
然后我有以下代码片段。 我相信这是有效的,因为Employee
对象隐含的数组是一个实现IEnumerable
的Array()类的实现。 因此,我相信这就是为什么数组可以分配给IEnumerable?
IEnumerable workforceTwo = new Employee[] { new Employee() { Name = "David", Years = 0, Department = "software" }, new Employee() { Name = "Dexter", Years = 3, Department = "software" }, new Employee() { Name = "Paul", Years = 4, Department = "software" } };
然后我有这个代码片段:
IEnumerable<Employee> workforceThree = new Employee[] { new Employee() { Name = "David", Years = 0, Department = "software" }, new Employee() { Name = "Dexter", Years = 3, Department = "software" }, new Employee() { Name = "Paul", Years = 4, Department = "software" } };
我不知道为什么这个代码片段的作品? IEnumerable<Employee>
从IEnumerable
inheritance(并覆盖(或重载?) GetEnumerator()
方法),但是不应该因此需要为上述工作转换:
//The cast does work but is not required IEnumerable<Employee> workforceFour = (IEnumerable<Employee>)new Employee[] { new Employee() { Name = "David", Years = 0, Department = "software" }, new Employee() { Name = "Dexter", Years = 3, Department = "software" }, new Employee() { Name = "Paul", Years = 4, Department = "software" } };
看来这个数组是从一个IEnumerable
types隐式地向下转换为IEnumerable<Employee>
但是我一直认为当你需要将一个types转换为更具体的types时,你需要一个明确的转换。
也许我在我的理解中错过了一些简单的东西,但是有人可以帮我理解这个。
谢谢。
从文档 :
在.NET Framework 2.0版中,Array类实现了
System.Collections.Generic.IList<T>
,System.Collections.Generic.ICollection<T>
和System.Collections.Generic.IEnumerable<T>
通用接口。 这些实现在运行时提供给数组,因此对于文档构build工具是不可见的。 因此,通用接口不会出现在Array类的声明语法中,并且只有通过将数组转换为通用接口types(显式接口实现)才能访问的接口成员没有参考主题。
因此,你的Employee[]
实现IEnumerable<Employee>
。
Employees的数组默认实现了IEnumerable<Employee>
以及IEnumerable
当某些句子需要被降级时,需要显式强制转换 。 这是把一个对象转换成更专门化的types – 如果对象是这种特殊types的 – 。
另一方面, 向上转换 (转换为不太专业化的types)将永远不需要明确的转换,但是可以明确地执行转换(这只是无用的)。
由于Array实现了IEnumerable
和IEnumerable<T>
,因此您在代码中进行了上传 ,这意味着您不需要明确地将其转换为IEnumerable<T>
。