将数组投射到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时,你需要一个明确的转换。

也许我在我的理解中错过了一些简单的东西,但是有人可以帮我理解这个。

谢谢。

3 Solutions collect form web for “将数组投射到IEnumerable <T>”

从文档 :

在.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>

  • 如何重写List <T>在C#中的Add方法?
  • 在Java中通过types参数的类作为generics方法的types参数
  • 嘲笑一种方法,使用mockito返回带有通配符的generics
  • 在C#中有参数约束的通用构造函数吗?
  • .NET是否有内置的EventArgs <T>?
  • Mockito:使用通用参数进行validation
  • 用LINQselect一个字典<T1,T2>
  • 该组件没有uri标识的资源
  • 优雅的方式来结合多个元素的集合?
  • 将parameter passing给模板types的C#genericsnew()
  • 为什么从SQL Server 2008及更高版本中不支持generics派生的CLRtypes?