为什么这个foreach循环会抛出错误,但for循环却没有?

时间:2017-09-08 12:22:12

标签: c# foreach

所以我尝试使用谷歌搜索,但我找不到任何能回答我问题的信息。

基本上我有一个由{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();

6 个答案:

答案 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项)。