2015-10-08 17 views
0
DataTable test = new DataTable(); 
foreach (var r in test.Rows) 
{ 
    r[1].tostring(); 
} 

爲什麼編譯器不明白r是DataRow? 請參閱下圖瞭解錯誤消息。var的行爲

enter image description here

+3

test.Rows返回什麼類型? –

回答

12

DataTable.Rows使用的舊式(非通用)集合的屬性。實際的類型是DataRowCollection,它定義了非通用的an enumerator,因此它返回類型爲object的實例。爲了解決這個問題的框架(3.5+)稱爲DataTable.AsEnumerable返回正確類型的枚舉的後續版本也提供了新的擴展方法:

DataTable test = new DataTable(); 
foreach (var r in test.AsEnumerable()) 
{ 
    r[1].ToString(); 
} 

如果你是卡在.NET的舊版本你會必須手動將r轉換爲DataRow

1

DataTable.Rows的類型是DataRowCollection,它繼承自InternalDataCollectionBase,它繼承了非通用的ICollection。所以它是不是ICollection<DataRow>,而是objects的集合。見here
With foreach (DataRow r in test.Rows),您明確告訴C#將每個對象轉換爲一個DataRow

0

var是一個隱式類型!它別名任何類型!當你聲明一個「var類型」時,你基本上是在告訴編譯器嘿看,我不知道什麼類型適合這個,所以無論右邊表達式的類型如何評估,都是合適的類型!

因此, 顯然,每一行都作爲一個對象返回,所以除非將它們轉換爲適當的類型,否則它們將保持爲對象!

相關問題