使用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); } 

像我期望的那样工作。 这有什么特别的原因吗?

谢谢。

这是因为RowsDataRowCollection ,而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。