开关中的变量,回路中的开关,情况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什么都没有发生,则矩阵为空。我认为循环是问题所在?

开关中的变量,回路中的开关,情况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中,您必须检查矩阵是否已经填充。