代码之家  ›  专栏  ›  技术社区  ›  devuxer

为什么var在“foreach(table.rows中的var row)”中计算为system.object?

  •  17
  • devuxer  · 技术社区  · 14 年前

    当我进入这个 foreach 声明…

    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 . 所以问题不在于 var 不适用于 前额 条款。


    所以,有点奇怪 DataRowCollection 项目不会自动评估为 DataRow . 但我不知道是什么。有人能解释吗?


    更新

    我对马克的哪一个答案感到很困惑(科德卡和奥利弗)…最后,我决定把科德卡的答案标出来,因为它确实回答了我的问题,但奥利弗回答了我应该问的问题:)

    2 回复  |  直到 14 年前
        1
  •  17
  •   Dean Harding    14 年前

    那是因为 DataRowCollection 类只实现的非泛型版本 IEnumerable . 所以编译器不知道变量的类型。

    通过显式地将类型放入其中,基本上可以告诉编译器从中生成显式强制转换 object DataRow .

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

        2
  •  12
  •   Oliver    14 年前

    虽然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);
    }