Почему 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, потому что он действительно отвечает на мой вопрос, но Оливер отвечает на вопрос, который я должен был задавать 🙂

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

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

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

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

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

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

 int columnIndex = 2; foreach(var row in MyDataTable.AsEnumerable()) { var content = row.Field(columnIndex); }