【问题标题】:Why does C# "var" keyword not work when looping through a Visio Masters collection?为什么循环通过 Visio Masters 集合时 C#“var”关键字不起作用?
【发布时间】:2009-09-01 18:54:52
【问题描述】:

我正在使用 Visio API 循环遍历 Microsoft.Office.Interop.DocumentMasters 集合中的每个 Microsoft.Office.Interop.Visio.Master 对象。

当我如下使用var时,编译器只将master识别为object类型并抛出错误:

foreach (var master in doc.Masters)

相反,我必须这样做才能使其工作:

foreach (Visio.Master master in doc.Masters)

为什么会这样?通常我在 foreach 循环中使用 var 没有问题。

编辑:我在master 上使用Open 方法时得到的错误是:

'object' 不包含定义 对于“打开”并且没有扩展方法 'Open' 接受第一个参数 可以找到类型“对象”(你是 缺少 using 指令或 汇编参考?)

【问题讨论】:

    标签: c# type-inference


    【解决方案1】:

    我的猜测是 doc.Masters 正在返回 IEnumerableIEnumerable<object> - 即它是弱类型的。

    在第二个版本中基本上有一个隐式转换 - 它正在做(假设非泛型形式):

    using (IEnumerator enumerator = doc.Masters.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            Visio.Master master = (Visio.Master) enumerator.Current;
            // Loop body
        }
    }
    

    它只知道您感兴趣的类型,因为您已将其指定为变量的类型。 (这是一个,类似于指定范围变量的类型,这使得编译器在 LINQ 查询表达式的扩展中调用 Cast<T>()。)

    【讨论】:

    • 它绝对是弱类型的,因为它来自 COM - 并且所有源自 COM 的序列都是普通的IEnumerables(因为没有地方可以从其中获取元素的类型注释)。
    • @Pavel:这就是我的猜测,但我的 COM 知识与它公开的集合一样薄弱;)
    【解决方案2】:

    只要集合(或您使用它的任何东西)不是强类型,var 关键字就不起作用。换句话说:当很明显表达式的右侧返回某个类型时,var 起作用。

    例子:

    var name = "Markus";   // Must be string
    var form = new Form(); // Must be form
    

    但是,当类型为“对象”时,var 也将代表一个对象。

    例子:

    var myList = new ArrayList(); // var = ArrayList
    foreach (var item in myList) // item = object
    { }
    

    但是,如果列表是强类型的,则 var 将按预期工作:

    var myList = new List<string>();
    foreach (var item in myList)  // item = string
    { }
    

    我不知道 Visio API,但我的假设是 var 会变成一个对象,因此对你来说不是很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      • 2020-02-28
      • 2010-11-15
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      相关资源
      最近更新 更多