为什么这个演员不工作?

Bri*_*don 7 c# collections

此代码有效:

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)

...但它会在执行时抛出异常.