欢迎,我在开关中遇到小功能问题。 我的问题是“使用未分配的局部变量'矩阵'” 这是一个代码:
static void Main(string[] args)
{
char wyj = 'n';
do
{
Console.WriteLine("1. add numbers into matrix \n2. show matrix \n3. end");
int a;
Console.Write("\nYour choice: ");
a = int.Parse(Console.ReadLine());
switch (a)
{
case 1:
Console.WriteLine("You choose: 1");
int element;
Console.Write("\nsize of matrix: ");
int matrixsize;
matrixsize = Int32.Parse(Console.ReadLine());
int[,] matrix = new int[matrixsize, matrixsize];
for (int i = 0; i <= matrixsize - 1; i++)
{
for (int j = 0; j <= matrixsize - 1; j++)
{
Console.Write("element{0},{1} =", i + 1, j + 1);
element = int.Parse(Console.ReadLine());
matrix[i, j] = element;
}
}
break;
case 2:
Console.WriteLine("You choose 2");
foreach (int x in matrix)
Console.Write(x);
break;
case 3:
Console.WriteLine("End the program? y- yes, n- no");
wyj = char.Parse(Console.ReadLine());
break;
}
}
while (wyj != 'y');
Console.WriteLine("Koniec programu!");
Console.ReadKey();
}
我需要做什么?
在Doc Brown回答之后,如果没有任何反应,矩阵是空的。 我认为循环是问题吗?
答案 0 :(得分:2)
你不应该假设用户先输入1,然后输入2,但预计这可能会反过来。
int[,] matrix
必须在 switch语句之前完成,并且您应该将变量设置为null int[,] matrix=null;
matrix = new int[matrixsize, matrixsize]
可以保持原样,但case 2
块中,您必须检查矩阵是否已初始化if(matrix!=null) {/*...*/}
答案 1 :(得分:0)
您已经假设编译器无法验证 - 您将始终生成矩阵正在形成查看它。编译器知道在switch语句中不必是这种情况,因此它会阻止您使用可能从未设置的变量(或者在这种情况下,甚至声明)。如果要保留此代码,请将变量声明在大小写之外并将其初始化为新矩阵。如果可以安全显示,请检查案例二。
答案 2 :(得分:0)
matrix
变量是交换机的本地变量。 case 2
使用case 1
中的变量,因为case
没有引入范围,但从未在那里初始化,因为初始化程序在执行时不会执行case 2
。
如果您提供初始化程序,将变量移出switch
将使错误无效,但在每次迭代中它仍然是 new 变量,因此当您填入{ {1}},在下一次迭代中执行case 1
时,它会变空。您需要将变量一直移出循环以使值保持不变。
您仍然不应该假设用户按正确顺序提供输入,因此在case 2
中您必须检查矩阵是否已填写。