开关中的变量,回路中的开关,情况2中的错误
本文关键字:开关 错误 情况 回路 变量 | 更新日期: 2023-09-27 18:29:45
欢迎,我在switch中遇到小函数问题。我的问题是"使用未分配的局部变量‘matrix’"这是一个代码:
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回答后,如果情况2什么都没有发生,则矩阵为空。我认为循环是问题所在?
您不应该假设用户首先输入1,然后输入2,但预计这种情况可能会反过来发生。
- 声明
int[,] matrix
必须在开关语句之前完成,并且应该在int[,] matrix=null;
处将变量设置为null - 初始化
matrix = new int[matrixsize, matrixsize]
可以停留在原地,但是 - 在
case 2
块中,您必须检查矩阵是否已初始化if(matrix!=null) {/*...*/}
您已经假设编译器无法验证——您将始终在查看矩阵时生成矩阵。编译器知道switch语句中不必是这种情况,因此它可以防止您使用可能从未设置过(在这种情况下,甚至是声明过)的变量。如果要保留此代码,请在大小写之外声明变量,并将其初始化为新矩阵。然后在第二种情况下检查是否可以安全显示。
matrix
变量是交换机的本地变量。case 2
使用case 1
中的变量,因为case
没有引入作用域,但它从未在那里初始化过,因为在执行case 2
时不会执行初始化器。
如果您提供初始值设定项,将变量移出switch
将使错误静音,但在每次迭代中,它仍然是一个新的变量,因此当您在case 1
中填充它时,在下一次迭代中执行case 2
时,它将变为空。您需要将变量一直移出循环,以使to值保持不变。
您仍然不应该假设用户以正确的顺序提供输入,因此在case 2
中,您必须检查矩阵是否已经填充。