2010-02-24 19 views
24

¿Hay alguna razón por la que no puede hacer lo siguiente:¿Por qué no puedo hacer foreach (var Item en DataTable.Rows)?

foreach (var Item in DataTable.Rows) { 

en lugar de tener que hacer

foreach (DataRow Item in DataTable.Rows) { 

yo habría pensado que esto era posible, como lo es en otros tipos de datos. Por ejemplo:

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

Cuando intento del primer bucle foreach, me sale el error CS0021 la : No se puede aplicar la indexación con [] a una expresión del tipo 'objeto'.

¿Por qué el compilador no puede darse cuenta de que .Rows devuelve una colección de DataRows?

Respuesta

25

Rows devuelve efectivamente IEnumerable (DataRowCollection), por lo que el compilador sólo puede recoger object como el tipo de var. Use Rows.Cast<DataRow> si quiere usar var.

Cast se define en Enumerable, por lo que debe incluir System.Linq.

+0

Fueron tablas de datos antes de los genéricos? –

+0

@Arnis: Absolutamente, DataTable ha estado desde 1.0. –

+0

Entonces, supongo que ese es el verdadero motivo. Ty Jon para aclaración. :) –

20

Brian tiene toda la razón acerca de la razón de esto, pero hay una manera más sencilla de evitarlo: utilizar :

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

Gracias por una solución tan ingeniosa :) He mantenido la respuesta aceptada como la de Brian pero utilizaré la tuya. Es hora de leer un poco más sobre Enumerables ... – GateKiller

+8

Diría que la solución real al problema sería no usar var en esta instancia ... – cjk

+1

@ck: De acuerdo, pero vale la pena saber sobre 'AsEnumerable' para vincularse con otros métodos LINQ. –

Cuestiones relacionadas