使用C#var进行System.Data.Datarow的隐式类型

时间:2012-09-27 13:17:27

标签: c# datarow implicit-typing

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

假设我正在使用标准System.Data.DataTable(其中包含System.Data.DataRow个对象的集合),上面的变量'row'将解析为object类型,而不是{ {1}}。

System.Data.DataRow

按照我的预期工作。这有什么特别的原因吗?

感谢。

4 个答案:

答案 0 :(得分:21)

这是因为RowsDataRowCollection,而IEnumerable而不是IEnumerable<DataRow>,这意味着推断的类型将为object

当您在foreach中明确说明类型时,您会指示c#为每个调用添加强制转换,这就是它工作的原因。

答案 1 :(得分:5)

发生隐式演员。另请注意,如果无法进行强制转换,则可能会抛出 InvalidCastException

答案 2 :(得分:4)

table.Rows是一个DataRowCollection,IEnumberable(而非IEnumerable<T>,T为DataRow),所以它不是DataRow的强类型,但是一个对象,即它是一个对象的集合。

您可以使用DataTableforeach (var row in table.AsEnumerable()) { } 扩展程序 - http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx

{{1}}

答案 3 :(得分:1)

试试这个:

System.Data.DataTable dt = new System.Data.DataTable();

foreach (var row in dt.Rows.Cast<System.Data.DataRow>())
{

}

要使用Rows.Cast,您必须使用System.Linq。