将数组转换为IEnumerable <T>


76

假设您有一个Employee这样的基本类:

class Employee
{
   public string Name;
   public int Years;
   public string Department;
}

然后(在一个单独的类中)我有以下代码片段(我想我理解除了最后一个以外的所有内容):

我相信以下代码片段可以工作,因为数组初始化器创建了一个Employee对象数组,该对象与分配给其的forceforce变量具有相同的类型。

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隐式对象数组是Array()类的实现,该类实现了IEnumerable。因此,我相信这就是为什么可以将数组分配给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(并重写(或重载?)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" } };

数组似乎是从类型隐式向下转换的IEnumerableIEnumerable<Employee>但是我一直认为,当您需要将类型转换为更具体的类型时,需要显式转换。

也许我在这里缺少我所了解的一些简单信息,但是有人可以帮助我进行一些了解。

谢谢。


3
@Aliostad:就在workforceThree片段下面。
Heinzi 2011年

Answers:


114

文档中

在.NET Framework 2.0版,Array类实现System.Collections.Generic.IList<T>System.Collections.Generic.ICollection<T>以及System.Collections.Generic.IEnumerable<T>通用接口。这些实现是在运行时提供给数组的,因此对于文档构建工具不可见。结果,通用接口不会出现在Array类的声明语法中,并且没有接口成员的参考主题,这些参考成员只能通过将数组转换为通用接口类型来访问(显式接口实现)。

因此,您的Employee[]工具IEnumerable<Employee>


12
为了澄清,它不是Array类实现它,它的T []任何T的
IllidanS4支持莫妮卡


3

当某些句子需要贬低时,需要显式转换。如果对象具有特殊类型,则将其转换为更特殊的类型。

另一方面,向上转换(广播到不太专业的类型)将永远不需要显式的强制转换,但是您可以显式地进行转换(这是无用的)。

由于阵列工具IEnumerableIEnumerable<T>,你正在做一个上溯造型在你的代码,这意味着_you并不需要显式转换IEnumerable<T>


3
我不同意。在某些情况下,您需要显式的上流。作为示例,函数重写:void DoStuffs(IEnumerable <T> objects){...} void DoStuffs(params T [] objects){DoStuffs((IEnumerable <T>)objects); }
Orace

2
@Orace这不是完全不正确的方法...它是编译器的帮助,它可以调用所需的重载...您是否同意?;)这是方法重载解析的问题。
马蒂亚斯Fidemraizer

@Orace嗯,这是一个上溯造型,但我的意思是,你需要明确的“中投”来调用所需的过载...
马蒂亚斯Fidemraizer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.