当我进入这个foreach声明时......
foreach (var row in table.Rows)
Run Code Online (Sandbox Code Playgroud)
... var的工具提示说 class System.Object
我很困惑为什么不是class System.Data.DataRow.
(如果你想知道,是的,我using System.Data在我的代码文件的顶部.)
如果我明确声明类型,如...
foreach (DataRow row in table.Rows)
Run Code Online (Sandbox Code Playgroud)
...它没有错误,工作正常.
如果我这样做......
var numbers = new int[] { 1, 2, 3 };
foreach (var number in numbers)
Run Code Online (Sandbox Code Playgroud)
... var评估为struct System.Int32.所以,问题var不是在foreach子句中不起作用.
因此,DataRowCollection项目不会自动评估的位置有些奇怪DataRow.但我无法弄清楚它是什么.有人有解释吗?
更新
我真的被撕裂了对Mark的回答(Codeka和Oliver)......最后,我决定标记Codeka,因为它真的回答了我的问题,但Oliver回答了我应该问的问题:)
Dea*_*ing 18
那是因为DataRowCollection类只实现了非泛型版本IEnumerable.所以编译器不知道变量的类型是什么.
通过显式地将类型放在那里,你基本上告诉编译器生成一个显式的object转换DataRow.
这是一个问题,你会发现许多集合和类在.NET 1.x天后,在泛型可用之前添加回来.
Oli*_*ver 12
虽然codeka是正确的,但是存在一些其他方法来为这个DataTable和DataRow东西提供更多便利.
使用.Net 3.5,您可以添加程序集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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1423 次 |
| 最近记录: |