使用C#var进行System.Data.Datarow的隐式类型
foreach (var row in table.Rows) { DoSomethingWith(row); }
假设我正在使用标准的System.Data.DataTable
(它有一个System.Data.DataRow
对象的集合),上面的变量’row’解析为object
类型,而不是System.Data.DataRow
。
foreach (DataRow row in table.Rows) { DoSomethingWith(row); }
像我期望的那样工作。 这有什么特别的原因吗?
谢谢。
这是因为Rows
是DataRowCollection
,而DataRowCollection
又是IEnumerable
而不是IEnumerable
,这意味着推断的类型将是object
。
当你在foreach
明确声明类型时,你会指示c#为每个调用添加强制转换,这就是它工作的原因。
发生隐式演员。 另请注意,如果无法进行强制转换,则可以抛出InvalidCastException 。
table.Rows
是一个table.Rows
,它是IEnumberable
(而不是IEnumerable
,T是DataRow
),所以它不是强类型的DataRow
,而是一个对象,即它是一个对象的集合。
你可以使用一个DataTable
扩展 – http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx
foreach (var row in table.AsEnumerable()) { }
试试这个:
System.Data.DataTable dt = new System.Data.DataTable(); foreach (var row in dt.Rows.Cast()) { }
要使用Rows.Cast,您必须使用System.Linq。