为什么这段代码不好?未分配的局部变量错误与foreach

时间:2016-09-09 15:19:08

标签: c#

此代码正常运作。

public class Hello{
    public static void Main(){
    int a = 1;
    int[] i = new int[]{1,2,3};
    foreach(int n in i)
    {
        a = n;
    }
    System.Console.WriteLine(a);
    }
}

这段代码也很好。

public class Hello{
    public static void Main(){
    int a ;
    int[] i = new int[]{1,2,3};
    System.Console.WriteLine(a);
    }
}

虽然,下一个代码不起作用。 编译器说“使用未分配的局部变量'a'”。

public class Hello{
    public static void Main(){
    int a ;
    int[] i = new int[]{1,2,3};
    foreach(int n in i)
    {
        a = n;
    }
    System.Console.WriteLine(a);
    }
}

为什么这段代码不好?

4 个答案:

答案 0 :(得分:1)

因为编译器不知道 i 变量中是否有任何元素。如果没有,则 将保持未分配状态。

答案 1 :(得分:0)

数组i可能是空的(从编译器的角度来看),尽管我们现在来自i包含一些元素的声明。但我认为编译器"认为" foreach循环可能没有执行,因此所有代码路径都不会分配a

顺便说一句 - 第二个例子遇到了同样的问题:

public class Hello{
    public static void Main(){
        int a ;   // <= not assigened either
        int[] i = new int[]{1,2,3};
        System.Console.WriteLine(a);
    }
}

答案 2 :(得分:0)

因为编译器无法知道i是否包含任何元素。如果i为空数组,则a将被取消分配。

答案 3 :(得分:0)

编译器不够智能,无法知道行a = n;至少运行一次。 知道该行会运行,因为它位于foreach循环中,循环遍历非空集合。但编译器不知道这一点。

由于编译器不知道行a = n;将会运行,因此它认为在执行a时可能会取消分配变量System.Console.WriteLine(a)。所以它会给你一个错误信息。