Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将数组强制转换为IEnumerable<;T>;_C#_Arrays_Generics_Casting - Fatal编程技术网

C# 将数组强制转换为IEnumerable<;T>;

C# 将数组强制转换为IEnumerable<;T>;,c#,arrays,generics,casting,C#,Arrays,Generics,Casting,假设您有一个基本的Employee类: class Employee { public string Name; public int Years; public string Department; } 然后(在一个单独的类中)我有以下代码片段(我想除了最后一个我都懂): 我相信下面的代码片段是有效的,因为array initiliser创建了一个Employee对象数组,这些对象的类型与分配给它的workforce变量的类型相同 Employee[] workforceO

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

class Employee
{
   public string Name;
   public int Years;
   public string Department;
}
然后(在一个单独的类中)我有以下代码片段(我想除了最后一个我都懂):

我相信下面的代码片段是有效的,因为array initiliser创建了一个Employee对象数组,这些对象的类型与分配给它的workforce变量的类型相同

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
类型隐式向下转换为
IEnumerable
,但我一直认为,当您需要将类型转换为更具体的类型时,您需要显式转换

也许我在理解上遗漏了一些简单的东西,但是有人能帮我理解一下吗

谢谢。

发件人:

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


因此,您的
Employee[]
实现了
IEnumerable

默认情况下,Employee数组实现了
IEnumerable
以及
IEnumerable

当某些句子需要向下转换时,需要显式转换。这就是将一个对象强制转换为一个更专业化的类型——如果该对象是这样的专业化类型的话

另一方面,向上转换(转换为不太专业的类型)将永远不需要显式转换,但您可以显式地执行(这只是无用的)


由于数组实现了
IEnumerable
IEnumerable
,您在代码中执行了一个向上转换,这意味着您不需要显式转换到
IEnumerable

@Aliostad:它就在
workforceThree
片段的正下方。为了澄清,实现它的不是数组类,而是[]我不同意。在某些情况下,您需要显式向上投射。例如函数重写:void DoStuffs(IEnumerable对象){…}void DoStuffs(params T[]对象){DoStuffs((IEnumerable)对象);}@Orace这并不完全是一个向上转换。。。这是一个编译器帮助,让它调用所需的重载。。。你同意吗这是一个方法重载解决问题。@Orace好吧,这是一个向上转换,但我的意思是您需要显式的“转换”来调用所需的重载。。。
//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" } };