18
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);
}

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

谢谢。

4

4 回答 4

22

那是因为Rowsis DataRowCollection,而 isIEnumerable和 not IEnumerable<DataRow>,这意味着推断的类型将是object

当您明确声明 type in 时foreach,您指示 c# 为每个调用添加强制转换,这就是它起作用的原因。

于 2012-09-27T13:20:32.523 回答
5

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

于 2012-09-27T13:21:33.397 回答
4

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

您可以使用一个DataTable扩展 - http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx

foreach (var row in table.AsEnumerable())
{

}
于 2012-09-27T13:21:52.417 回答
1

试试这个:

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

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

}

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

于 2012-09-27T13:26:30.283 回答