.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-没有什么可转换的