此代码有效:
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)
{
}
...但是它将在执行时引发异常。