.NET为什么字符串[]可以作为IEnumerable传递<;字符串>;参数

.NET为什么字符串[]可以作为IEnumerable传递<;字符串>;参数,.net,arrays,type-conversion,.net,Arrays,Type Conversion,这是有效代码: void func(IEnumerable<string> strings){ foreach(string s in strings){ Console.WriteLine(s); } } string[] ss = new string[]{"asdf", "fdsa"}; func(ss); void func(IEnumerable字符串){ foreach(字符串中的字符串s){ 控制台。写入线(s); } } 字符串[]

这是有效代码:

void func(IEnumerable<string> strings){
    foreach(string s in strings){
        Console.WriteLine(s);
    }
}

string[] ss = new string[]{"asdf", "fdsa"};
func(ss);
void func(IEnumerable字符串){
foreach(字符串中的字符串s){
控制台。写入线(s);
}
}
字符串[]ss=新字符串[]{“asdf”、“fdsa”};
func(ss);

我想知道的是,隐式转换
string[]->IEnumerable
是如何工作的

Array
类实现了
IEnumerable

数组实现了IEnumerable,因此对于任何T[],都有到IEnumerable的转换

来自:

在.NET Framework 2.0版中,数组类实现

  • IList
  • i收集
    ,以及
  • IEnumerable
通用接口。实现是在运行时提供给阵列的,因此文档构建工具不可见。因此,泛型接口不会出现在数组类的声明语法中,并且没有接口成员的引用主题,这些主题只能通过将数组强制转换为泛型接口类型(显式接口实现)来访问。向其中一个接口强制转换数组时需要注意的关键问题是,添加、插入或删除元素的成员抛出
NotSupportedException


这是一个标准的接口转换;作为一项要求,数组(
T[]
)实现
IEnumerable
IEnumerable
。因此
字符串[]
IEnumerable
完全兼容。实现由编译器提供(在.NET泛型存在之前,数组基本上是泛型的)

根据规范(ECMA 334 v4)-这是13.1.4的结果:

  • 从一维数组类型
    S[]
    System.Collections.Generic.IList
    和base 此接口的接口
  • 从一维数组类型
    S[]
    System.Collections.Generic.IList
    以及此接口的基本接口,前提是存在从
    S
    T
    的隐式引用转换
回想一下,
IList:IEnumerable

隐式转换字符串[]->IEnumerable如何工作

这一点没有抓住重点,因为没有转换。数组实现了IEnumerable(如果这对您更有意义的话,您几乎可以说“继承自”),因此string[]已经是一个IEnumerable-没有什么可转换的