这是有效的代码:
void func(IEnumerable<string> strings){
foreach(string s in strings){
Console.WriteLine(s);
}
}
string[] ss = new string[]{"asdf", "fdsa"};
func(ss);
我想知道的是,隐式转换string[] -> IEnumerable<string>
如何运作?
答案 0 :(得分:12)
在.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[]
)实现IEnumerable
和IEnumerable<T>
。因此string[]
与IEnumerable<T>
100%兼容。实现由编译器提供(在.NET泛型存在之前,数组基本上是通用的)。
从规范(ECMA 334 v4) - 这是13.1.4的结果:
S[]
到System.Collections.Generic.IList<S>
和基数
此接口的接口。S[]
到System.Collections.Generic.IList<T>
以及此接口的基本接口,前提是存在从S
到T
的隐式引用转换。< / LI>
回想起IList<T> : IEnumerable<T>