foreach (var row in table.Rows)
{
DoSomethingWith(row);
}
假设我正在使用标准System.Data.DataTable
(其中包含System.Data.DataRow
个对象的集合),上面的变量'row'将解析为object
类型,而不是{ {1}}。
System.Data.DataRow
按照我的预期工作。这有什么特别的原因吗?
感谢。
答案 0 :(得分:21)
这是因为Rows
是DataRowCollection
,而IEnumerable
而不是IEnumerable<DataRow>
,这意味着推断的类型将为object
。
当您在foreach
中明确说明类型时,您会指示c#为每个调用添加强制转换,这就是它工作的原因。
答案 1 :(得分:5)
发生隐式演员。另请注意,如果无法进行强制转换,则可能会抛出 InvalidCastException 。
答案 2 :(得分:4)
table.Rows
是一个DataRowCollection,IEnumberable
(而非IEnumerable<T>
,T为DataRow
),所以它不是DataRow
的强类型,但是一个对象,即它是一个对象的集合。
您可以使用DataTable
个foreach (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。