将数组投射到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>IEnumerableinheritance(并覆盖(或重载?) 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" } }; 

看来这个数组是从一个IEnumerabletypes隐式地向下转换为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实现了IEnumerableIEnumerable<T> ,因此您在代码中进行了上传 ,这意味着您不需要明确地将其转换为IEnumerable<T>