属性set方法中使用switch处理不同类型值的类型转换问题
问题分析与修复
你的代码存在三个核心问题,直接导致报错和潜在运行时崩溃:
- 类型不匹配:构造函数传入字符串参数,直接赋值给
bool类型的属性InpVariable,C#不允许字符串与布尔值的隐式转换,因此触发"无法将字符串类型隐式转换为布尔类型"的错误。 - 无限递归:属性
InpVariable的get方法返回自身(return InpVariable;),运行时会不断递归调用,最终导致栈溢出。 - 语法错误:
switch分支的case "No"后多写了一个分号,属于无效语法。
修复后的代码方案
方案1:构造函数内直接处理字符串转换
private bool inpVariable; // 修正属性的get/set逻辑,直接操作私有字段 private bool InpVariable { get { return inpVariable; } set { inpVariable = value; } } public inpClass(string inpVariable) { // 统一转小写并去除首尾空格,避免大小写或空格导致匹配失败 var input = inpVariable?.Trim().ToLower() ?? ""; switch (input) { case "yes": InpVariable = true; break; case "no": InpVariable = false; break; default: InpVariable = false; // 可根据业务需求改为抛出异常 break; } }
方案2:封装转换方法(提升复用性)
private bool inpVariable; private bool InpVariable { get { return inpVariable; } set { inpVariable = value; } } // 封装字符串转布尔值的方法,可在其他场景复用 public void SetInpVariable(string input) { inpVariable = input?.Trim().Equals("Yes", StringComparison.OrdinalIgnoreCase) ?? false; } public inpClass(string inpVariable) { SetInpVariable(inpVariable); }
关键注意点
- 必须让属性的
get返回私有字段,避免递归调用导致栈溢出。 - 字符串转换时建议忽略大小写并去除空格,提升输入兼容性。
- 默认值可根据需求调整,比如输入非"Yes"/"No"时抛出
ArgumentException,而非直接设为false。
内容的提问来源于stack exchange,提问作者Rock1432
相关产品推荐
相关产品推荐

