代码之家  ›  专栏  ›  技术社区  ›  RexE

在Visio Masters集合中循环时,为什么C#“var”关键字不起作用?

  •  4
  • RexE  · 技术社区  · 15 年前

    我正在使用Visio API来循环每个 Microsoft.Office.Interop.Visio.Master 对象 Microsoft.Office.Interop.Document Masters

    当我使用 var master as类型 object 并抛出一个错误:

    foreach (var master in doc.Masters)
    

    相反,我必须这样做才能让它工作:

    foreach (Visio.Master master in doc.Masters)
    

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

    :当我使用 Open 方法论 是:

    “对象”不包含定义 对于“打开”和无扩展方法 “打开”接受的第一个参数为 找不到类型“object”(是否为 缺少using指令或

    2 回复  |  直到 15 年前
        1
  •  16
  •   Jon Skeet    15 年前

    我猜是这样 doc.Masters IEnumerable IEnumerable<object> -也就是说,它是弱类型的。

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

    它只知道您感兴趣的类型,因为您已将其指定为变量的类型。(这是一个 Cast<T>() 在LINQ查询表达式的展开中。)

        2
  •  2
  •   Markus Egger Markus Egger    15 年前

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

    例子:

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

    但是,当类型为“object”时,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
    { }
    

    我不知道VisioAPI,但我的假设是var会变成一个对象,因此对您不是很有用。