是什么让.Net IEnumerable如此特殊,以至于像数组这样的编译器类型可以作为一个参数传递给它,它是一个类库接口。在后台是否有某种继承?
当数组可以互换地替换集合或IEnumerable作为参数时实际发生的事情:
public void DoJob(IEnumerable<Job> jobs)
{
}
喜欢这个方法调用:
Job job = new Job();
DoJob(new [] { job });
答案 0 :(得分:3)
由于您来自Java,我将首先告诉您,在C#中,有一个统一的类型系统,其中每个类型都派生自object
,而不像Java那样有特殊的&#34;原语&# 34。
所以在C#中,数组只是另一种类型。谁说他们不能实现接口?他们能!所有编译器都提供了一些创建它们的语法。实际上,数组&#39;类型为documentation。
这是它的声明:
public abstract class Array : ICloneable, IList, ICollection,
IEnumerable, IStructuralComparable, IStructuralEquatable
请参阅那里的IEnumerable
编辑:
对于IEnumerable<T>
,我们可以在语言规范中找到它:
第12.1.2节:
一维数组T []实现接口 System.Collections.Generic.IList(简称IList)及其基础 接口
IList<T>
实施IEnumerable<T>
。
答案 1 :(得分:3)
数组是.NET中的一个特例,因为不允许您直接从Array
类继承。
一维数组实现
IList<T>
,ICollection<T>
,IEnumerable<T>
,IReadOnlyList<T>
和IReadOnlyCollection<T>
通用接口。这些实现在运行时提供给数组,因此,通用接口不会出现在Array
类的声明语法中。
这是因为.NET 1.0中不存在泛型,并且为了防止破坏性更改,必须应用编译器黑客。
答案 2 :(得分:0)
IEnumerable
是Interface
,您所指的是Polymorphism
。
.NET中的数组,列表,集合和许多其他类型至少具有基本IEnumerable
接口。如果您创建参数request Job[]
,则只能使用Job数组,这意味着在将List
或其他集合传递给参数之前,必须将其转换为Array。这意味着该方法有望出于特定原因处理和期望数组。如果方法不关心集合,列表或数组的类型并且只想迭代项目,那么它应该在继承树中看起来更低,以便许多类型可以使用该方法。制作方法IEnumerable<Job>
允许该方法使用从IEnumerable<T>
派生的任何类型,在这种情况下,T
的类型为Job
。
知道这个List<Job>, ObservableCollection<Job>, Job[]
或linq查询,选择Job加上更多可以使用此方法。