Использование С# var для неявного ввода System.Data.Datarow
foreach (var row in table.Rows)
{
DoSomethingWith(row);
}
Предполагая, что я работаю со стандартным System.Data.DataTable
(который имеет коллекцию объектов System.Data.DataRow
), переменная 'row' выше разрешается как тип object
, а не System.Data.DataRow
.
foreach (DataRow row in table.Rows)
{
DoSomethingWith(row);
}
Работает так, как я ожидал. Есть ли для этого конкретная причина?
Спасибо.
Ответы
Ответ 1
Это потому, что Rows
есть DataRowCollection
, который, в свою очередь, IEnumerable
, а не IEnumerable<DataRow>
, что означает, что тип выводится object
.
Когда вы явно указываете тип в foreach
, вы указываете С# добавлять приведение к каждому вызову, поэтому он работает.
Ответ 2
Неявный бросок происходит. Также обратите внимание, что InvalidCastException может быть сброшено, если трансляция невозможна.
Ответ 3
table.Rows
- это DataRowCollection, который является IEnumberable
(а не IEnumerable<T>
, T является DataRow
), поэтому он не сильно типизирован для DataRow
, а является объектом, т.е. представляет собой набор объектов,
Есть расширения DataTable
, которые вы можете использовать - http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx
foreach (var row in table.AsEnumerable())
{
}
Ответ 4
Попробуйте следующее:
System.Data.DataTable dt = new System.Data.DataTable();
foreach (var row in dt.Rows.Cast<System.Data.DataRow>())
{
}
Чтобы использовать Rows.Cast, вы должны использовать System.Linq.