所以我尝试使用谷歌搜索,但我找不到任何能回答我问题的信息。
基本上我有一个由{1,2,3,4,5,6,7,8,9,10}组成的数组。我有一个for循环和一个foreach循环,据我所知做同样的事情(只打印可被2整除的数字)。 for循环工作正常 - 它打印2,4,6,8和10. foreach循环似乎也打印正确的整数,但由于某种原因它会抛出IndexOutOfRangeExeption。为什么for循环工作完全没有错误,但foreach循环打印正确的整数但仍然会抛出错误?
以下是代码:
int[] tenNums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Console.WriteLine(tenNums.Length);
for (int i = 0; i < tenNums.Length; i++)
{
if (tenNums[i] % 2 == 0)
{
Console.WriteLine(tenNums[i]);
}
}
foreach (int i in tenNums)
{
if (tenNums[i] % 2 == 0) // <== Error happens on this line
{
Console.WriteLine(tenNums[i]);
}
}
Console.ReadKey();
答案 0 :(得分:8)
foreach (int i in tenNums)
{
if (tenNums[i] % 2 == 0) // <== Error happens on this line
{
Console.WriteLine(i);
}
}
在此foreach中,i
将连续获取tenNums
内的每个值的值。所以i
不再是你正在递增的索引。您正在尝试访问使用数字10作为索引时未为阵列分配的内存。更改它,以便您检查i
:
foreach (int i in tenNums)
{
if (i % 2 == 0)
{
Console.WriteLine(i);
}
}
答案 1 :(得分:4)
for
循环从0开始并上升到9. foreach
从第一个值1开始,然后上升到最后一个值10.当您使用索引器访问数组时它是0索引的,所以你有一个错误。
你真正想要的是:
foreach (int i in tenNums)
{
if (i % 2 == 0) // <= No need to use the indexer since we already have the value
{
Console.WriteLine(i);
}
}
答案 2 :(得分:2)
使用foreach
循环时,您应使用i
而不是tenNums[i]
。
所以:
foreach (int i in tenNums)
{
if (i % 2 == 0)
{
Console.WriteLine(i);
}
}
这基本上是foreach
在此上下文中的要点 - 避免使用tenNums[i]
。
即使您遇到的错误也会显示foreach
的好处。使用tenNums[something]
时,您始终需要关注something
是否实际有效(例如,您可能有一个错误的错误)。使用foreach
没有这样的问题 - i
将工作。
答案 3 :(得分:1)
你的第一个for循环将使用0,1,2,3,4,5,6,7,8和9。
你的第二个foreach循环将使用1,2,3,4,5,6,7,8,9和10,因为它们是数组中的值。
在tenNums上会发生什么[10]?错误!
答案 4 :(得分:1)
非常简单。
而不是这个:
if (tenNums[i] % 2 == 0)
{
Console.WriteLine(tenNums[i]);
}
使用此:
if (i % 2 == 0)
{
Console.WriteLine(i);
}
答案 5 :(得分:1)
因为你试图在foreach循环中访问tenNums [10](tenNums的第10项)。