Подтвердить что ты не робот

Использование С# 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);
}

Работает так, как я ожидал. Есть ли для этого конкретная причина?

Спасибо.

4b9b3361

Ответ 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.