我遇到了以下错误之一:
- "索引超出范围。必须是非负数且小于集合大小"
- "插入索引超出范围。必须是非负数且小于或等于大小。"
- "索引超出数组范围。"
这是什么意思,我该如何修复它?
参见
IndexOutOfRangeException(索引超出范围异常)
ArgumentOutOfRangeException(参数超出范围异常)
我遇到了以下错误之一:
这是什么意思,我该如何修复它?
参见
IndexOutOfRangeException(索引超出范围异常)
ArgumentOutOfRangeException(参数超出范围异常)
因为您试图使用一个超出集合边界的数值索引来访问集合中的元素。
集合中的第一个元素通常位于索引0
处。最后一个元素位于索引n-1
处,其中n
是集合的大小(它包含的元素数量)。如果您尝试使用负数作为索引,或者使用大于Size-1
的数字,则会发生错误。
当您声明一个类似这样的数组时:
var array = new int[6]
数组中的第一个和最后一个元素是
var firstElement = array[0];
var lastElement = array[5];
因此,当您编写以下代码时:
var element = array[5];
你正在检索数组中的第六个元素,而不是第五个。
通常,您会像这样循环遍历数组:
for (int index = 0; index < array.Length; index++)
{
Console.WriteLine(array[index]);
}
这段代码之所以正常运行,是因为循环从零开始,并在Length-1
结束,因为此时index
不再小于Length
。
然而,以下代码将抛出异常:
for (int index = 0; index <= array.Length; index++)
{
Console.WriteLine(array[index]);
}
注意那里的<=
了吗?最后一个循环迭代中,index
将会超出范围,因为循环认为Length
是一个有效的索引,但实际上它不是。
列表的工作方式相同,只是通常使用Count
而不是Length
。他们仍然从零开始,到Count-1
结束。
for (int index = 0; i < list.Count; index++)
{
Console.WriteLine(list[index]);
}
然而,您也可以使用 foreach
来遍历列表,完全避免索引的问题:
foreach (var element in list)
{
Console.WriteLine(element.ToString());
}
如果还没有将元素添加到集合中,那么无法对其进行索引。
var list = new List<string>();
list.Add("Zero");
list.Add("One");
list.Add("Two");
Console.WriteLine(list[3]); // Throws exception.
var list = new List<int>(10); list[0] = 10;
将会抛出 IndexOutOfRange 异常。 - Selman Genç