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

时间:2009-03-31 15:03:23

标签: .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);

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

5 个答案:

答案 0 :(得分:12)

来自:msdn Array Class

  

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

     
      
  • IList<T>
  •   
  • ICollection<T>
  •   
  • IEnumerable<T>
  •   
     

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

数组实现IEnumerable,因此对于任何T []都有转换为IEnumerable&lt; T&gt;。

答案 3 :(得分:2)

  

如何隐式转换字符串[] - &gt; IEnumerable work?

那种错过了重点,因为没有转换。数组实现(你几乎可以说“继承自”,如果这对你更有意义)IEnumerable,所以string [] 已经一个IEnumerable - 没有什么可以转换

答案 4 :(得分:0)

这是标准的界面转换;作为要求,数组(T[])实现IEnumerableIEnumerable<T>。因此string[]IEnumerable<T> 100%兼容。实现由编译器提供(在.NET泛型存在之前,数组基本上是通用的)。

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

  • 从一维数组类型S[]System.Collections.Generic.IList<S>和基数 此接口的接口。
  • 从一维数组类型S[]System.Collections.Generic.IList<T>以及此接口的基本接口,前提是存在从ST的隐式引用转换。< / LI>

回想起IList<T> : IEnumerable<T>