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" } };