C#实例未在当前上下文存在问题求助:根据性别创建类实例报错
解决C#中实例变量作用域导致的访问错误问题
嗨,我来帮你搞定这个问题~你遇到的报错核心原因是变量作用域的问题,我一步步给你解释和解决:
为什么会报错?
你在if和else if的代码块里分别声明了real_sex变量:
if (sex == "boy") { // 这里的real_sex只在这个{}包裹的代码块里有效 Boy real_sex = new Boy { ... }; }
在C#中,变量的作用域就是它被声明的那个代码块,出了这个块,这个变量就相当于“不存在”了,所以你在块外面调用real_sex.Characteristics()时,编译器找不到这个变量,自然就报错啦。
解决方案:提前声明变量,用面向对象多态优化
最规范的做法是利用面向对象的多态特性,先定义一个基类,让Boy和Girl继承它,这样就能在外部统一声明变量类型,再在分支里实例化具体的子类。
第一步:定义基类和子类
先把你的Boy和Girl类改成继承自同一个基类(比如Person):
// 基类,定义共同的属性和方法 public class Person { public string Firstname { get; set; } public string Secondname { get; set; } // 定义虚方法,让子类重写实现各自逻辑 public virtual void Characteristics() {} } public class Boy : Person { // 重写基类方法,实现Boy的特性逻辑 public override void Characteristics() { Console.WriteLine($"I'm a boy named {Firstname} {Secondname}"); } } public class Girl : Person { // 重写基类方法,实现Girl的特性逻辑 public override void Characteristics() { Console.WriteLine($"I'm a girl named {Firstname} {Secondname}"); } }
第二步:修改主程序代码
在if/else块外面先声明Person类型的变量,然后在分支里给它赋值具体的子类实例:
Console.WriteLine("Are you a boy or a girl?"); string sex = Console.ReadLine(); Console.WriteLine(sex); while ((sex != "boy") && (sex != "girl")) { Console.WriteLine("That is not a valid sex. Please answer the question again."); sex = Console.ReadLine(); } // 先在外部声明变量,作用域覆盖后续所有代码 Person real_sex = null; if (sex == "boy") { Console.WriteLine("You are a boy"); real_sex = new Boy { Firstname = "George", Secondname = "Smith" }; } else if (sex == "girl") { Console.WriteLine("You are a girl"); real_sex = new Girl { Firstname = "Charlotte", Secondname = "Smith" }; } // 现在可以正常调用方法了! real_sex.Characteristics();
额外小提示
如果你暂时不想用基类,也可以用dynamic类型(但不推荐,因为会失去编译时类型检查,容易隐藏错误):
dynamic real_sex = null; // 后面的赋值逻辑和上面一致 real_sex.Characteristics();
但还是建议用基类的方式,这是更符合面向对象设计的写法,也能让代码更易维护。
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

