Utilisation de C # var pour le typage implicite de System.Data.Datarow

foreach (var row in table.Rows) { DoSomethingWith(row); } 

En supposant que je travaille avec un System.Data.DataTable standard (qui contient une collection d’objects System.Data.DataRow ), la variable ‘row’ ci-dessus est résolue en tant que type d’ object et non en tant que System.Data.DataRow .

 foreach (DataRow row in table.Rows) { DoSomethingWith(row); } 

Fonctionne comme je m’y attendais. A-t-il une raison particulière pour ceci?

Merci.

En effet, Rows est DataRowCollection , qui est à son tour IEnumerable et non IEnumerable , ce qui signifie que le type inféré sera un object .

Lorsque vous indiquez explicitement le type dans foreach , vous indiquez à c # d’append un acteur à chaque appel, raison pour laquelle cela fonctionne.

Une dissortingbution implicite se produit. Notez également qu’une exception InvalidCastException peut être levée si le transfert n’est pas possible.

table.Rows est un DataRowCollection qui est IEnumberable (et non IEnumerable , T étant DataRow ), il n’est donc pas fortement typé dans un DataRow , mais un object, c’est-à-dire une collection d’objects.

Il existe cependant des extensions DataTable que vous pouvez utiliser: http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx

 foreach (var row in table.AsEnumerable()) { } 

Essaye ça:

 System.Data.DataTable dt = new System.Data.DataTable(); foreach (var row in dt.Rows.Cast()) { } 

Pour utiliser Rows.Cast, vous devez utiliser System.Linq.