2017-01-17 4 views
0

Я использую набор данных, и когда я итерацию по колоннам с петлей Еогеасп я не могу получить ColumnName (если используется уаг ключевое слово):C# DataSet Еогеасп

например

DataTable table1 = new DataTable("patients"); 
table1.Columns.Add("name"); 
table1.Columns.Add("id"); 
table1.Rows.Add("sam", 1); 
table1.Rows.Add("mark", 2); 

И чем использование Еогеасп:

enter image description here

Но если Еогеасп утверждение явно определено:

enter image description here

Все в порядке. Я знаю, что foreach является синтаксическим сахаром для Enumarator. Это какое-то наследие и отсутствие дженериков?

+0

Это не редкость. Мой VS 2017 RC будет обрабатывать ваш код подобно тому, как объект является столбцом, но копия VS 2015, которую я нахожу, мне нужно явно указать или объявить тип в foreach. Я думаю, что это больше проблема IDE, чем что-либо. – CDove

+0

@CamiloTerevinto Это 'объект', потому что код был написан на C# 1.0, и у них не было лучших вариантов, а не потому, что столбцы на самом деле не являются экземплярами' DataColumn'. – Servy

+0

Возможный дубликат [Почему var, используемый в foreach для XmlNode, не выводит реальный тип, только объект?] (Http://stackoverflow.com/questions/17106986/why-var-used-in-foreach-for-xmlnode-does -not-deduce-real-type-only-object) –

ответ

0

DataTable.Columns - это DataColumnCollection. DataColumnCollection реализует IEnumerable, а не IEnumerable <DataColumn>. Оператор foreach выполняет бросок для того, что вы указываете. Var указывает, что возвращает метод перечислителя (в этом случае Object).

+0

IEnumerable, не IEnumerable. Угадайте, что вы имеете в виду IEnumerator. Но почему это забрасывает объект/обычно var получает тип объекта? –

+0

Ответ здесь заключается в том, что он реализует стандартный «IEnumerable», а не общий «IEnumerable ». Это означает, что итерация через DataTable.Columns возвращает объекты типа 'object', если вы не принуждаете их к другому типу (DataColumn), делая что-то вроде' foreach (столбец DataColumn в таблице1.Columns) ' – Ceshion

0

Это какое-то наследие и отсутствие дженериков?

Да. Этот код был написан на C# 1.0 до того, как существовали дженерики.