为什么 C# 无法推断数据表行的类型



我正在尝试遍历数据表并从特定列中获取值。到目前为止,我只有 for 循环的骨架。

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# 不能像我尝试迭代string[]那样推断row的类型?

为什么 C# 不能像我尝试迭代字符串 [] 时那样推断行的类型?

TL;DR:DataTable早于泛型:(

DataTable.Rows被声明返回DataRowCollection,它派生自InternalDataCollectionBase。这实现了非泛型ICollection接口,这意味着编译器无法推断出row的类型,而不仅仅是object

这不是特定于DataTable- 任何时候您都有只实现IEnumerable而不是IEnumerable<T>的东西(并且没有更具体的GetEnumerator方法供编译器使用),推断的迭代元素类型只是object。在foreach循环中为变量指定显式类型时,编译器会以静默方式插入强制转换。

我会完全按照您所做的更改保留更改,但另一种方法是使用CastLINQ 方法:

foreach (var row in currentTable.Rows.Cast<DataRow>())
{
var valueAtCurrentRow = row[0];
}

DataTableRows属性是DataRowCollection类型的对象。

DataRowCollection本身继承自实现ICollectionIEnumerableInternalDataCollectionBase

这些集合中包含的数据类型没有比Object进一步指定,因此无法推断出DataRow类。

请参阅此处以供参考。

它的原因是行是DataRowCollectionIEnumerable而不是IEnumerable<T>,其中T是DataRow。

相关内容

  • 没有找到相关文章

最新更新