1

WinFormアプリでメニューを作成していますが、次のようなことをしていました:

MenuItem[] items = new MenuItem[] { };

以降 :

for (int namesIndex = 0; namesIndex < menuNames.Length; namesIndex++)
{
    MenuItem item = new MenuItem(menuNames[namesIndex]);

    for (int entriesIndex = 0; entriesIndex < menuEntries.GetLength(1); entriesIndex++)
    {
       item.MenuItems.Add(menuEntries[namesIndex, entriesIndex]);
    }

    items[namesIndex] = item;
}

IndeOutOfRangeException がスローされます。

ここに画像の説明を入力

この迷惑な例外の後、配列宣言を次のように変更しました。

 MenuItem[] items = new MenuItem[] { null };

すべてが魔法のように機能します。

そして今、質問:上記の配列宣言が機能し、他の配列宣言が機能しない理由を知っている人はいますか? どうもありがとう

4

4 に答える 4

3

配列初期化子を使用して配列を構築しているため、配列の長さは提供するデータによって決まります。

最初の例では、要素を指定しないため、長さゼロの配列を宣言しています。つまり、要素を含めることはできません。

2 番目の例では、長さ 1 の配列を宣言しています。

于 2014-05-05T17:37:59.003 に答える
2
MenuItem[] items = new MenuItem[] { };

これにより、項目が 0 の配列が作成されます。

MenuItem[] items = new MenuItem[] { null };

これにより、1 つの項目を含む配列が作成されます (null ですが、それでもカウントされます)。

おそらく、必要なアイテムの数を初期化する必要があります(new MenuItem[menuNames.Length]たとえば、 )。または、new List<MenuItem>()代わりに を使用して、 を呼び出しますAdd()

于 2014-05-05T17:38:09.150 に答える
2

「すべてが魔法のように機能する」のは、menuNamesアイテムが 1 つだけの場合のみです。機能させるには、次のようにコードを変更する必要があります。

MenuItem[] items = new MenuItem[menuNames.Length];

最初のケースでクラッシュが発生した理由は、項目が 0 の配列を作成したためですが、2 番目のケースでは項目が 1 つの配列を作成したためです。menuNames複数の要素がある場合、コードは再びクラッシュし始めます。

于 2014-05-05T17:38:34.793 に答える