访问应用程序.OpenForms通过foreach vs. index

本文关键字:vs index foreach 通过 应用程序 OpenForms 访问 | 更新日期: 2023-09-27 18:07:22

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

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

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

foreach (var form in Application.OpenForms)
{
  form.Name = "A new name";
}
编译器告诉我form是一个对象。为什么会这样?

访问应用程序.OpenForms通过foreach vs. index

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

在循环中将对象强制转换为Form类型:

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

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