foreach循环中使用var关键字的类型确定逻辑疑问
解释foreach中var与ArrayList的类型逻辑矛盾问题
这里完全不存在逻辑矛盾,核心是要分清编译时类型推断和运行时实例类型的区别:
ArrayList的编译时元素类型是object
ArrayList是C#早期的非泛型集合,它的设计就是存储object类型的对象——不管你往里存字符串、整数还是布尔值,在编译层面,这些元素都会被视为object(值类型会被自动装箱)。var的类型推断是编译时完成的
当你写foreach (var item in myList)时,编译器会分析myList的元素编译时类型:ArrayList的枚举器返回的Current属性类型是object,所以编译器直接把item的类型推断为object——这个过程在编译阶段就已经完成,和运行时实际存的元素类型毫无关系。运行时的赋值是object的多态表现
运行时,不同类型的元素(string、int、double、bool)被赋值给object类型的item,这是C#的多态特性:所有类型都继承自object,值类型会被装箱为object实例,引用类型可直接赋值。Console.WriteLine(item)时,会调用每个实例自身的ToString()方法(运行时根据实际类型动态调用),但item本身的编译时类型始终是object。
直白点说:把代码里的var换成object,运行效果完全一样——这也能证明var在这里就是推断成了object,根本没有所谓的“类型未明确”的情况。
内容的提问来源于stack exchange,提问作者Ekin Ekin
相关产品推荐
相关产品推荐

