C#中的“var”类型推断

可能重复:
为什么var在“foreach(table.Rows中的var row)”中评估为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的想法是你可以在变量声明/初始化中的任何地方使用它而不改变行为

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

所以你可以做到以下几点:

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

因此,即使列表是object类型,它也可以在foreach中随意转换为int。

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

GetEnumerator方法就此返回IEnumerator ,而不是IEnumerator

因此,唯一可用的类型信息是它返回object ,因此当您指定枚举DataRow您将添加自己的转换,而var则不会。

令人困惑的是, foreach(SomeType thing in SomeCollection)并不只是遍历集合,它还会在迭代时尝试为每个项目转换为SomeType。 但是对于var,没有什么可以投射的。