2010-05-07 74 views
17

当我进入这个foreach声明...为什么var在“foreach(var row in table.Rows)”中评估为System.Object?

foreach (var row in table.Rows) 

... var的提示说class System.Object

我很困惑,为什么它不是class System.Data.DataRow

(如果你想知道,是的,我有using System.Data我的代码文件的顶部)。


如果我显式声明的类型,如...

foreach (DataRow row in table.Rows) 

...它工作正常,没有错误。


另外,如果我做...

var numbers = new int[] { 1, 2, 3 }; 
foreach (var number in numbers) 

... VAR的计算结果为struct System.Int32。所以,问题不是varforeach子句中不起作用。


所以,有一些奇怪DataRowCollection在项目不自动计算为DataRow。但我无法弄清楚它是什么。有没有人有解释?


更新

我真的很撕裂,其回答标记(Codeka和Oliver)......最终,我决定以纪念Codeka的,因为它真实地回答我的问题,但奥利弗回答问题我应该一直在问:)

回答

17

这是因为DataRowCollection类只实现IEnumerable的非通用版本。所以编译器不知道变量的类型是什么。

通过明确地把类型放在那里,你基本上告诉编译器生成一个明确的从objectDataRow

这是一个问题,在泛型可用之前,您会发现很多集合和类在.NET 1.x天内添加的。

12

虽然codeka是正确的,但还有其他一些方法可以让这个DataTableDataRow东西更方便。您可以添加程序集System.Data.DataSetExtensions

它包含了一些扩展功能,如AsEnumerable(this System.Data.DataTable)Field<T>(this System.Data.DataRow, int)有了它,你可以在foreach循环中调用它,直接浇铸列到正确的类型:

int columnIndex = 2; 

foreach(var row in MyDataTable.AsEnumerable()) 
{ 
    var content = row.Field<double>(columnIndex); 
} 
+0

大点! +1 – 2010-05-07 10:26:56

+0

喜欢这个答案。 +1 – wonea 2011-10-25 13:14:20