2010-05-07 10 views
17

Cuando entro en esta declaración foreach ...¿Por qué var evalúa a System.Object en "foreach (var row in table.Rows)"?

foreach (var row in table.Rows) 

... La descripción de var dice class System.Object

estoy confundido por qué no es class System.Data.DataRow.

(En caso de que se esté preguntando, sí, tengo using System.Data en la parte superior de mi archivo de código.)


Si declaro el tipo de forma explícita, como en ...

foreach (DataRow row in table.Rows) 

... funciona bien sin errores.


También si lo hago ...

var numbers = new int[] { 1, 2, 3 }; 
foreach (var number in numbers) 

... var evalúa a struct System.Int32. Entonces, el problema no es que var no funcione en una cláusula foreach.


Por lo tanto, hay algo extraño en DataRowCollection donde los elementos no evalúan automáticamente a DataRow. Pero no puedo descifrar de qué se trata. ¿Alguien tiene una explicación?


actualización

realmente estaba roto, que responda a marcar (Codeka y Oliver) ... Al final, decidí marcar Codeka de porque realmente responde a mi pregunta, pero Oliver responde a la pregunta que debería haber estado preguntando :)

Respuesta

17

Eso es porque la clase DataRowCollection solo implementa la versión no genérica de IEnumerable. Entonces el compilador no sabe cuál es el tipo de la variable.

Al poner explícitamente el tipo allí, básicamente le dice al compilador que genere una conversión explícita de object a DataRow.

Este es un problema que encontrará con muchas de las colecciones y clases agregadas en .NET 1.x días, antes de que los genéricos estuvieran disponibles.

12

Mientras codeka tiene razón, existen otros métodos para obtener más comodidad en este DataTable y DataRow cosas.

Con .Net 3.5 puede agregar el conjunto System.Data.DataSetExtensions.

contiene algunas funciones de extensión como AsEnumerable(this System.Data.DataTable) o Field<T>(this System.Data.DataRow, int) con ella se le puede llamar dentro de un bucle foreach y echó la columna directamente en el tipo apropiado:

int columnIndex = 2; 

foreach(var row in MyDataTable.AsEnumerable()) 
{ 
    var content = row.Field<double>(columnIndex); 
} 
+0

gran punto! +1 –

+0

Me encanta esta respuesta. +1 – wonea

Cuestiones relacionadas