Когда я вхожу в это заявление 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
с ним, вы можете вызвать его в цикле foreach и передать столбец прямо в соответствующий тип:
int columnIndex = 2; foreach(var row in MyDataTable.AsEnumerable()) { var content = row.Field(columnIndex); }