IEnumerable和数组之间的关系

时间:2018-05-22 12:03:47

标签: c# .net

是什么让.Net IEnumerable如此特殊,以至于像数组这样的编译器类型可以作为一个参数传递给它,它是一个类库接口。在后台是否有某种继承?

当数组可以互换地替换集合或IEnumerable作为参数时实际发生的事情:

public void DoJob(IEnumerable<Job> jobs)
{
}

喜欢这个方法调用:

Job job = new Job();
DoJob(new [] { job });

3 个答案:

答案 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类继承。

来自documentation

  

一维数组实现IList<T>ICollection<T>IEnumerable<T>IReadOnlyList<T>IReadOnlyCollection<T>通用接口。这些实现在运行时提供给数组,因此,通用接口不会出现在Array类的声明语法中。

这是因为.NET 1.0中不存在泛型,并且为了防止破坏性更改,必须应用编译器黑客。

答案 2 :(得分:0)

IEnumerableInterface,您所指的是Polymorphism

.NET中的数组,列表,集合和许多其他类型至少具有基本IEnumerable接口。如果您创建参数request Job[],则只能使用Job数组,这意味着在将List或其他集合传递给参数之前,必须将其转换为Array。这意味着该方法有望出于特定原因处理和期望数组。如果方法不关心集合,列表或数组的类型并且只想迭代项目,那么它应该在继承树中看起来更低,以便许多类型可以使用该方法。制作方法IEnumerable<Job>允许该方法使用从IEnumerable<T>派生的任何类型,在这种情况下,T的类型为Job

知道这个List<Job>, ObservableCollection<Job>, Job[]或linq查询,选择Job加上更多可以使用此方法。