为什么循环访问Visio Masters集合时C#"var"关键字不起作用?

Rex*_*exE 4 c# type-inference

我使用Visio API来遍历每Microsoft.Office.Interop.Visio.Master一个对象Microsoft.Office.Interop.DocumentMasters集合.

当我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返回IEnumerableIEnumerable<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查询表达式时调用.)

  • @Pavel:这就是我的猜测,但我的COM知识与它所暴露的集合一样弱;) (2认同)