DataColumnCollection
реализует IEnumerable
, и каждая возвращаемая строка равна a DataColumn
, но не реализует IEnumerable<DataColumn>
. Поскольку он не реализует интерфейс, вы не можете привести к интерфейсу. Поскольку класс запечатан, компилятор знает , что значение не может реализовать интерфейс, поэтому вы даже не можете преобразовать его во время компиляции.
Используйте метод LINQ Cast
:
table.Columns.Cast<DataColumn>()
Это эффективный метод адаптера - каждый элемент в коллекции столбцов будет лениво приведен к DataColumn
, когда вы извлекаете его из результата.
Причина компиляции foreach
заключается в том, что компилятор добавляет явное приведение для вас. Например, это будет compile :
foreach (string x in table.Columns)
{
}
... но он выдаст исключение во время выполнения.