6

可能重复:
为什么 var 在“foreach (var row in table.Rows)”中计算为 System.Object?

今天我很惊讶地发现了以下内容......

SqlDataReader reader = cmd.ExecuteReader();
DataTable schemaTable = reader.GetSchemaTable();


// the following compiles correctly
foreach (DataRow field in schemaTable.Rows)
{
    Console.WriteLine(field["ColumnName"]);
}


// the following does not compile as 'var' is of type 'object'
foreach (var field in schemaTable.Rows)
{
    // Error: Cannot apply indexing with [] to an expression of type 'object'
    Console.WriteLine(field["ColumnName"]);
}

这里发生了什么?

这是类型推断失败吗?如果是这样,是什么原因造成的?

或者它是定义行为的一部分还是var?如果是这样,为什么?

我认为var你可以在变量声明/初始化中的任何地方使用它而不改变行为

4

3 回答 3

4

这里的重点不是 var,而是 foreach 循环。除了迭代自身之外,foreach 循环还可以选择强制转换迭代器。

因此,您可以执行以下操作:

List<object> test = new List<object>();
test.Add(1);
test.Add(2);
test.Add(3);
foreach( int i in test ){
  i.Dump();
}

因此,即使列表是对象类型,它也可以在 foreach 中动态转换为 int。

于 2011-02-08T13:43:09.317 回答
1

DataTable.Rows返回System.Data.DataRowCollection是 的子类InternalDataCollectionBase

这个GetEnumerator方法返回IEnumerator,而不是IEnumerator<DataRows>.

因此,唯一可用的类型信息是它返回object,因此当您指定要枚举时,DataRow您正在添加自己的演员表,但var事实并非如此。

于 2011-02-08T13:44:30.380 回答
0

令人困惑的是,foreach(SomeType thing in SomeCollection)它不仅会遍历集合,还会在迭代时尝试将每个项目强制转换为 SomeType 。但是使用 var 没有什么可以转换的。

于 2011-02-08T13:44:29.713 回答