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

これRowsDataRowCollection、 is であり、 is でIEnumerableあり、 notIEnumerable<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)、 に強く型付けされていません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 に答える