2010-02-24 9 views
24

Czy istnieje powód, dlaczego nie mogę wykonać następujące czynności:Dlaczego nie mogę zrobić foreach (var Item w DataTable.Rows)?

foreach (var Item in DataTable.Rows) { 

zamiast robić

foreach (DataRow Item in DataTable.Rows) { 

bym, że to było możliwe, jak to jest w innych typów danych. Na przykład:

foreach (var Employee in Staff) { // string[] Staff etc... 

Kiedy próbuję pierwszej pętli foreach, otrzymuję ten błąd CS0021: Nie można stosować z indeksowania [] w celu wyrażenia typu „obiektu”.

Dlaczego kompilator nie może stwierdzić, że .Rows zwraca kolekcje DataRows?

Odpowiedz

25

Rows skutecznie zwraca IEnumerable (DataRowCollection), więc kompilator może jedynie podnieść object jako typ dla var. Użyj Rows.Cast<DataRow>, jeśli chcesz użyć var.

Cast jest zdefiniowany na Enumerable, więc musisz dołączyć System.Linq.

+0

Were DataTables przed generycznych? –

+0

@Anis: Absolutnie, DataTable istnieje od 1.0. –

+0

Więc - to jest prawdziwy powód. Ty Jon dla wyjaśnienia. :) –

20

Brian jest absolutnie prawo o powód tego, ale istnieje prostszy sposób na uniknięcie go: używać :

foreach (var row in DataTable.AsEnumerable()) 
{ 
    ... 
} 
+0

Dziękuję za takie fajne rozwiązanie :) Zachowałem Akceptowaną Odpowiedź jako Briana, ale będę używał twojego. Czas przeczytać o Enumerables trochę więcej ... – GateKiller

+8

Powiedziałbym, że prawdziwym rozwiązaniem problemu byłoby nie używanie var w tym przypadku ... – cjk

+1

@ck: Zgoda, ale warto wiedzieć o 'AsEnumerable' w celu powiązania z innymi metodami LINQ. –