我使用Visio API来遍历每Microsoft.Office.Interop.Visio.Master一个对象Microsoft.Office.Interop.Document的Masters集合.
当我var按如下方式使用时,编译器只识别master为类型object并抛出错误:
foreach (var master in doc.Masters)
Run Code Online (Sandbox Code Playgroud)
相反,我必须这样做才能工作:
foreach (Visio.Master master in doc.Masters)
Run Code Online (Sandbox Code Playgroud)
为什么会这样?通常我var在foreach循环中使用没有问题.
编辑:我在使用Open方法时得到的错误master是:
'object'不包含'Open'的定义,也没有扩展方法'Open'可以找到接受'object'类型的第一个参数(你是否缺少using指令或汇编引用?)
Jon*_*eet 16
我的猜测是doc.Masters返回IEnumerable或IEnumerable<object>- 即它是弱类型的.
基本上在第二个版本中有一个隐式转换 - 它正在做(假设非泛型形式):
using (IEnumerator enumerator = doc.Masters.GetEnumerator())
{
while (enumerator.MoveNext())
{
Visio.Master master = (Visio.Master) enumerator.Current;
// Loop body
}
}
Run Code Online (Sandbox Code Playgroud)
它只知道你感兴趣的类型,因为你已经指定了它作为变量的类型.(这有点像指定范围变量的类型,这使得编译器Cast<T>()在扩展LINQ查询表达式时调用.)