此代码有效:

foreach(DataColumn column in table.Columns)
{
    // do whatever
}

但是这段代码没有:
(IEnumerable<DataColumn>)(table.Columns)
.Columns属性返回一个DataColumnCollection,它是一个实现IEnumerable的InternalDataCollectionBase,因此它应该可以工作。

我得到的错误是

最佳答案

DataColumnCollection实现IEnumerable,返回的每一行都是DataColumn,但不实现IEnumerable<DataColumn>。由于它没有实现接口(interface),因此无法转换为该接口(interface)。由于该类是密封的,因此编译器知道该值不可能实现接口(interface),因此您甚至不能在编译时将其强制转换为接口(interface)。

使用插入的LINQ Cast方法:

table.Columns.Cast<DataColumn>()

这实际上是一种适配器方法-从结果中获取列时,列集合中的每个元素都将被延迟转换为DataColumn
foreach编译的原因是编译器为您添加了显式强制转换。例如,它将编译:
foreach (string x in table.Columns)
{
}

...但是它将在执行时引发异常。

10-08 18:09