此代码有效:
foreach(DataColumn column in table.Columns)
{
// do whatever
}
Run Code Online (Sandbox Code Playgroud)
但是这段代码没有:
(IEnumerable<DataColumn>)(table.Columns)
Run Code Online (Sandbox Code Playgroud)
该.Columns属性返回一个DataColumnCollection,它是一个InternalDataCollectionBase,它实现了IEnumerable,因此它应该可以工作.
我得到的错误是
无法将类型'System.Data.DataColumnCollection'转换为'System.Collections.Generic.IEnumerable'
Jon*_*eet 19
DataColumnCollection实现IEnumerable,每个返回的行是一个DataColumn,但它没有实现IEnumerable<DataColumn>.由于它没有实现接口,因此无法转换为接口.由于类是密封的,编译器知道该值不可能实现接口,因此您甚至无法在编译时转换它.
使用LINQ Cast方法:
table.Columns.Cast<DataColumn>()
Run Code Online (Sandbox Code Playgroud)
这实际上是一个适配器方法 - DataColumn当你从结果中获取它时,列集合中的每个元素都将被懒惰地转换为.
foreach编译的原因是编译器为您添加了显式强制转换.例如,这将编译:
foreach (string x in table.Columns)
{
}
Run Code Online (Sandbox Code Playgroud)
...但它会在执行时抛出异常.