如何解决C# switch分支中未赋值局部变量's'的报错问题?
解决C#控制台程序“变量's'未赋值”错误并实现多次添加学生功能
你遇到的问题有两个核心原因:
- 数组
s是在case 1的代码块里声明的,作用域只限于这个代码块内部,case 2根本访问不到它,所以编译器直接报错“变量未赋值”。 - 就算能访问,当前代码每次选1都会新建一个仅包含单个学生的数组,之前输入的学生信息会被覆盖,没法实现多次输入累积的需求。
解决方案
用List<Student>替代固定长度的数组,把集合声明移到循环外部,确保所有case都能访问到,同时支持动态添加学生。
修改后的完整代码
class Program { static void Main(string[] args) { // 把学生集合声明在循环外,确保所有case都能访问 List<Student> studentList = new List<Student>(); string nume, prenume, facultate; int opt, varsta; double medieGenerala; do { Console.WriteLine("Introduceti optiunea dumneavoastra:"); Console.WriteLine("0. Iesire"); Console.WriteLine("1. Introduceti un nou student in catalog"); Console.WriteLine("2. Afisati studentii din catalog"); Console.WriteLine("3. Cautati un student dupa nume"); // 加输入校验,避免非数字输入导致程序崩溃 if (!int.TryParse(Console.ReadLine(), out opt)) { Console.WriteLine("Optiune invalida! Va rugam introduceti un numar."); continue; } switch(opt) { case 0: Environment.Exit(0); break; case 1: Console.Write("Introduceti numele studentului:- "); nume = Console.ReadLine(); Console.Write("Introduceti prenumele studentului:- "); prenume = Console.ReadLine(); // 给年龄加输入校验 Console.Write("Introduceti varsta studentului:- "); while (!int.TryParse(Console.ReadLine(), out varsta)) { Console.Write("Varsta invalida! Va rugam introduceti un numar intreg:- "); } Console.Write("Introduceti media generala a studentului:- "); while (!double.TryParse(Console.ReadLine(), out medieGenerala)) { Console.Write("Media invalida! Va rugam introduceti un numar real:- "); } Console.Write("Introduceti facultatea la care este studentul:- "); facultate = Console.ReadLine(); // 创建新学生对象并添加到集合,保留所有输入的学生 studentList.Add(new Student(nume, prenume, varsta, medieGenerala, facultate)); Console.WriteLine("Student adaugat cu succes!"); break; case 2: if (studentList.Count == 0) { Console.WriteLine("Nu exista studenti in catalog!"); break; } Console.WriteLine("Lista studentilor:"); foreach(Student st in studentList) { // 根据Student类的属性输出信息,也可以给Student类重写ToString方法简化输出 Console.WriteLine($"Nume complet: {st.Nume} {st.Prenume}, Varsta: {st.Varsta}, Media: {st.MedieGenerala}, Facultate: {st.Facultate}"); } break; case 3: Console.WriteLine("Functia de cautare este in curs de implementare."); break; default: Console.WriteLine("Optiune invalida! Va rugam alegeti o optiune valida."); break; } } while (true); } } // 配套的Student类定义(如果还未实现) public class Student { public string Nume { get; set; } public string Prenume { get; set; } public int Varsta { get; set; } public double MedieGenerala { get; set; } public string Facultate { get; set; } public Student(string nume, string prenume, int varsta, double medieGenerala, string facultate) { Nume = nume; Prenume = prenume; Varsta = varsta; MedieGenerala = medieGenerala; Facultate = facultate; } }
关键改动说明
- 调整集合作用域:将
List<Student>声明在do-while循环外部,确保case 1和case 2都能访问到同一个集合。 - 动态存储学生:每次选1时调用
Add方法添加新学生,而非新建数组,实现多次输入的信息累积。 - 增加输入校验:避免用户输入非数字内容导致程序崩溃,提升程序健壮性。
- 空集合判断:选2时如果还没有输入学生,直接提示用户,避免无意义的遍历操作。
内容的提问来源于stack exchange,提问作者eag1e3yes
相关产品推荐
相关产品推荐

