为什么这段代码不好?未赋值的局部变量foreach错误

本文关键字:赋值 局部变量 错误 foreach 段代码 代码 为什么 | 更新日期: 2023-09-27 18:06:27

代码正常运行。

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);
    }
}

为什么这段代码不好?

为什么这段代码不好?未赋值的局部变量foreach错误

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

数组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);
    }
}

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

编译器不够聪明,无法知道a = n;行保证至少运行一次。知道那一行会运行,因为它在一个foreach-loop中,它循环一个非空集合。但是编译器不知道这些

由于编译器不知道a = n;行将运行,它认为变量a可能在执行System.Console.WriteLine(a)时未赋值。它会给你一个错误信息