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

Почему var оценивает System.Object в "foreach (var row in table.Rows)"?

Когда я вхожу в этот оператор foreach...

foreach (var row in table.Rows)

... всплывающая подсказка для var говорит class System.Object

Я смущен, почему это не class System.Data.DataRow.

(Если вам интересно, да, у меня using System.Data вверху моего файла кода.)


Если я объявляю тип явно, как в...

foreach (DataRow row in table.Rows)

... он отлично работает без ошибок.


Также, если я...

var numbers = new int[] { 1, 2, 3 };
foreach (var number in numbers)

... var принимает значение struct System.Int32. Таким образом, проблема заключается не в том, что var не работает в предложении foreach.


Итак, что-то странное в DataRowCollection, когда элементы не автоматически оценивают до DataRow. Но я не могу понять, что это такое. У кого-нибудь есть объяснение?


Обновление

Я был действительно разорван, что ответила (Codeka и Oliver)... В конце концов, я решил отметить Codeka, потому что он действительно отвечает на мой вопрос, но Оливер отвечает на вопрос, который я должен был задавать:)

4b9b3361

Ответ 1

Это потому, что класс DataRowCollection реализует не общую версию IEnumerable. Поэтому компилятор не знает, что такое тип переменной.

Явным образом добавляя туда тип, вы в основном говорите компилятору о создании явного перевода из object в DataRow.

Это проблема, которую вы найдете со многими коллекциями и классами, добавленными в дни .NET 1.x, до того, как появились дженерики.

Ответ 2

В то время как Codeka прав, существуют некоторые другие методы, чтобы получить больше удобства в этом DataTable и DataRow.

С .Net 3.5 вы можете добавить сборку System.Data.DataSetExtensions.

Он содержит некоторые функции расширения, такие как AsEnumerable(this System.Data.DataTable) или Field<T>(this System.Data.DataRow, int) с ним, вы можете вызвать его в цикле foreach и перевести столбец непосредственно в соответствующий тип:

int columnIndex = 2;

foreach(var row in MyDataTable.AsEnumerable())
{
    var content = row.Field<double>(columnIndex);
}