c#中的以下数组声明有什么区别?

时间:2014-05-05 17:35:38

标签: c# arrays indexoutofrangeexception

我在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:

enter image description here

在这个烦人的异常之后,我用这个修改了数组声明:

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

一切都像魅力一样。

现在的问题是:有没有人知道为什么上面的数组声明有效,而另一个没有? 非常感谢

4 个答案:

答案 0 :(得分:3)

您正在使用数组初始值设定项来构造数组,因此数组的长度将由您提供的数据给出。

第一个示例声明一个长度为零的数组,因为您没有提供任何元素。即它不能包含任何元素。

第二个示例声明了一个长度为1的数组。

答案 1 :(得分:2)

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

这将创建一个包含0个项目的数组。

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

这会创建一个包含1个项目的数组(它为空,但仍然有效)。

您可能希望初始化所需的项目数(例如new MenuItem[menuNames.Length])。或者改为使用new List<MenuItem>(),并致电Add()

答案 2 :(得分:2)

&#34;一切都像一个魅力&#34;仅在menuNames只有一个项目的范围内。您需要按如下所示更改代码才能使其正常工作:

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

您在第一种情况下看到崩溃的原因是您创建了一个零项目的数组,而在第二种情况下,您创建了一个包含一个项目的数组。如果menuNames包含多个元素,则代码将再次开始崩溃。

答案 3 :(得分:0)

当你使用for数组的索引器时,你的menuNames.Length循环遍历将循环变量与items进行比较。其中一个是错误的。

此外,如果您想要将其他项添加到集合中,那么您几乎肯定会使用List,而不是数组。