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
因此,即使列表是object类型,它也可以在foreach中随意转换为int。
DataTable.Rows
返回System.Data.DataRowCollection
,它是InternalDataCollectionBase
的子类。
GetEnumerator
方法就此返回IEnumerator
,而不是IEnumerator
。
因此,唯一可用的类型信息是它返回object
,因此当您指定枚举DataRow
您将添加自己的转换,而var
则不会。
令人困惑的是, foreach(SomeType thing in SomeCollection)
并不只是遍历集合,它还会在迭代时尝试为每个项目转换为SomeType。 但是对于var,没有什么可以投射的。