为什么var推断类型对象而不是XmlNodeList循环中的XmlNode?

Ola*_*laf 8 c# xml type-inference

如果像这样循环遍历XmlNodeList

foreach (XmlNode foo in xmlNodeList) {string baa = foo.Attributes["baa"].Value;}
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作 - foo显然是XmlNode类型,VS.NET IDE显示方法和字段.

另一方面

foreach (var foo in xmlNodeList) { string baa = foo.Attributes["baa"].Value; }
Run Code Online (Sandbox Code Playgroud)

没有编译,因为这里foo是object类型.类型推断类型的工作,但推断对象.

显然,XmlNodeList的元素不是一个定义的类型,但是将它们分配给XmlNode而不是var会隐式地执行某些操作(强制转换或取消装箱).

第一个问题:背后的机制是什么?

第二个(相关)问题:如何找到可以在这种循环中使用的类型?VS.NET IDE有帮助吗?

Bol*_*ock 9

XmlNodeList仅实现非泛型IEnumerable接口,而不是IEnumerable<XmlNode>泛型.这样可以防止强大地键入其元素,直到您进行适当的转换,因此编译器别无选择,只能将隐式类型声明映射到objectforeach中.

如果你坚持使用var关键字,你可以xmlNodeList像这样强制转换元素:

foreach (var foo in xmlNodeList.Cast<XmlNode>())
{
    string baa = foo.Attributes["baa"].Value;
}
Run Code Online (Sandbox Code Playgroud)

但这很难看,无论如何都需要更多的击键.您也可以只是明确声明XmlNode foo,并让foreach随时为您投射.