【问题标题】:Access Application.OpenForms via foreach vs. index通过 foreach 与 index 访问 Application.OpenForms
【发布时间】:2013-04-03 08:09:30
【问题描述】:

我只是偶然发现了这个问题,我很好奇为什么会这样: 如果我通过索引访问Application.OpenForms 集合中的表单,编译器会告诉我它是一个表单:

var form = Application.OpenForms[0];
form.Name = "A new name";

这工作得很好。但如果我这样访问它:

foreach (var form in Application.OpenForms)
{
  form.Name = "A new name";
}

编译器告诉我form 是一个对象。为什么会这样?

【问题讨论】:

    标签: c# arrays winforms collections


    【解决方案1】:

    因为FormCollection 类实现了 非泛型 IEnumerable 接口(继承自 ReadOnlyCollectionBase),所以您在 foreach 循环中获得对象。但它有返回Form的索引器。

    只需在循环中将对象转换为Form 类型:

    foreach (Form form in Application.OpenForms)
    {
       form.Name = "A new name";
    }
    

    【讨论】:

    • 嗯,好的,谢谢。因此,始终将其“投射”到Form 是没有问题的,对吧?
    • @derape 确切地说,只需将对象转换为这样的形式foreach(Form form in Application.OpenForms)
    【解决方案2】:

    如果您检查Application.OpenForms 属性,其值由“包含此应用程序拥有的所有当前打开的表单的FormCollection”定义。其中FormCollection继承自ReadOnlyCollectionBase,那么集合中的每个实例都被定义为一个对象。因此,可以将其转换为 Form 以使用它,或者仅在 foreach 循环中使用 Form 而不是使用 var

    【讨论】:

      猜你喜欢
      • 2011-07-01
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 2012-03-02
      • 1970-01-01
      • 2021-07-04
      相关资源
      最近更新 更多