1

私はちょうどこの問題につまずいて、なぜそうなのか興味があります:Application.OpenFormsインデックス経由でのコレクション内のフォームにアクセスすると、コンパイラはそれがフォームであると教えてくれます:

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

これは完全に正常に機能します。しかし、次のようにアクセスすると:

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

コンパイラformは、オブジェクトであると教えてくれます。なぜこのようになっているのですか?

4

2 に答える 2

2

クラスが非ジェネリックIEnumerableインターフェイス (ReadOnlyCollectionBase から継承) をFormCollection実装しているため、foreach ループでオブジェクトを取得します。しかし、それには を返すインデクサーがあります。 Form

オブジェクトをキャストFormしてループに入力するだけです。

foreach (Form form in Application.OpenForms)
{
   form.Name = "A new name";
}
于 2013-04-03T08:16:17.723 に答える
0

プロパティをチェックするApplication.OpenFormsと、その値は「FormCollectionこのアプリケーションが所有する現在開いているすべてのフォームを含む A」によって定義されました。FormCollectionから継承さReadOnlyCollectionBaseれ、コレクション内のすべてのインスタンスがオブジェクトとして定義されました。したがって、使用するために a にキャストするか、Formを使用するよりもループで使用Formすることができます。foreachvar

于 2013-04-03T08:26:47.067 に答える