为什么这段代码不好?未赋值的局部变量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);
}
}
为什么这段代码不好?
因为编译器不知道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)
时未赋值。它会给你一个错误信息