我正在尝试迭代DataTable并从特定列获取值。到目前为止,我只有for循环的Skeleton。
foreach (var row in currentTable.Rows)
{
var valueAtCurrentRow = row[0];
}
这不像我预期的那样有效。尝试执行row[0]
时出现编译器错误,并显示以下消息:"无法将带有[]的索引应用于Object"类型的表达式。但row
不应该是对象,而是DataRow
。
要解决此问题,我将foreach循环更改为以下内容:
foreach (DataRow row in currentTable.Rows)
{
var valueAtCurrentRow = row[0];
}
为什么这有必要?为什么C#不能推断出row
的类型,就像我试图迭代一个string[]
一样?
答案 0 :(得分:17)
为什么C#不能像我试图迭代字符串[]那样推断行的类型?
TL; DR:DataTable
早于泛型:(
DataTable.Rows
返回DataRowCollection
,InternalDataCollectionBase
来自here。这实现了非通用ICollection
接口,这意味着编译器无法仅仅row
推断出object
的类型。
这不是DataTable
特有的 - 任何时候你只有IEnumerable
而不是IEnumerable<T>
的东西(并且没有更具体的GetEnumerator
方法对于编译器使用),推断的迭代元素类型只是object
。在foreach
循环中为变量指定显式类型时,编译器会以静默方式为您插入强制转换。
我会完全按照您的要求保留更改,但另一种方法是使用Cast
LINQ方法:
foreach (var row in currentTable.Rows.Cast<DataRow>())
{
var valueAtCurrentRow = row[0];
}
答案 1 :(得分:9)
Rows
的{{1}}属性是DataTable
类型的对象。
DataRowCollection
本身继承自实现DataRowCollection
和InternalDataCollectionBase
的{{1}}。
这些集合中包含的数据类型不会比ICollection
进一步指定,因此无法推断到IEnumerable
类。
请参阅{{3}}以供参考。
答案 2 :(得分:-3)
原因是行user.address
为Cannot set property 'residentialAddress' of undefined
而非DataRowCollection
,其中T为DataRow。