此代码正常运作。
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);
}
}
为什么这段代码不好?
答案 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)
。所以它会给你一个错误信息。