通过foreach与index访问Application.OpenForms

时间:2013-04-03 08:09:30

标签: c# arrays winforms collections

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

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

这完全没问题。但如果我这样访问它:

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

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

2 个答案:

答案 0 :(得分:2)

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

简单地将对象转换为Form循环类型:

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

答案 1 :(得分:0)

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