2010-05-07 54 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

相關問題