.NET为什么string []可以作为IEnumerable <string>参数传递?

Cri*_*scu 4 .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);
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*mas 12

来自:msdn数组类

在.NET Framework 2.0版中,Array类实现了

  • IList<T>,
  • ICollection<T>,和
  • IEnumerable<T>

通用接口.这些实现在运行时提供给数组,因此文档构建工具不可见.因此,通用接口不会出现在Array类的声明语法中,并且没有可通过将数组转换为通用接口类型(显式接口实现)来访问的接口成员的参考主题.将数组转换为其中一个接口时要注意的关键是添加,插入或删除元素的成员抛出NotSupportedException.


Ant*_*lev 5

Arrayclass,这是一个非常奇怪的野兽,由编译器和JIT特别对待(更多关于Richter和Don Box的书,我猜),实现IEnumerable<T>.