Use of C# var for implicit typing of System.Data.Datarow
-
04-07-2021 - |
Pregunta
foreach (var row in table.Rows)
{
DoSomethingWith(row);
}
Assuming that I'm working with a standard System.Data.DataTable
(which has a collection of System.Data.DataRow
objects), the variable 'row' above resolves as an object
type, not a System.Data.DataRow
.
foreach (DataRow row in table.Rows)
{
DoSomethingWith(row);
}
Works as I would expect. Is there a particular reason for this?
Thanks.
Solución
That's because Rows
is DataRowCollection
, which in turn is IEnumerable
and not IEnumerable<DataRow>
, which means that type inferred will be object
.
When you explicitly state type in foreach
, you instruct c# to add cast to each call, which is why it works.
Otros consejos
An implicit cast happens. Also note that an InvalidCastException can be thrown if the cast isn't possible.
table.Rows
is a DataRowCollection which is IEnumberable
( and not IEnumerable<T>
, T being DataRow
), so it is not strongly typed to a DataRow
, but a object i.e it is a collection of objects.
There is a DataTable
extensions which you can use though - http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx
foreach (var row in table.AsEnumerable())
{
}
Try this:
System.Data.DataTable dt = new System.Data.DataTable();
foreach (var row in dt.Rows.Cast<System.Data.DataRow>())
{
}
To use Rows.Cast you have to use System.Linq.