C#类属性switch异常:无枚举参数实例返回错误配件价格
问题原因
C# 中枚举类型的默认值是 0,当你使用无参构造函数创建 SalesQuote 实例时,类中存储枚举值的字段会被自动初始化为 0。如果你的 Accessories 枚举中没有定义值为0的「无配件」成员,或者第一个枚举成员的取值恰好是0,switch语句就会匹配到对应的case分支,返回505.05m,而非预期的0。
解决方案
1. 给枚举添加「无配件」标识成员
在 Accessories 枚举中新增一个值为0的成员,明确代表“未选择任何配件”:
public enum Accessories { None = 0, // 作为默认无配件的标识 Speakers = 1, // 调整原第一个枚举成员的取值,避免和0冲突 NavigationSystem = 2, // 其他配件成员... }
2. 调整switch语句逻辑
在 AccessoryCost 属性的switch分支中,优先处理「无配件」的情况,同时添加default分支兜底:
public class SalesQuote { private Accessories _selectedAccessory; public decimal AccessoryCost { get { return _selectedAccessory switch { Accessories.None => 0m, Accessories.Speakers => 505.05m, Accessories.NavigationSystem => 1200.75m, // 其他配件对应的价格分支... _ => 0m // 兜底,处理未定义的枚举值 }; } } // 无参构造函数:显式初始化枚举为None(可选,但逻辑更清晰) public SalesQuote() { _selectedAccessory = Accessories.None; } // 带枚举参数的构造函数 public SalesQuote(Accessories accessory) { _selectedAccessory = accessory; } }
3. (可选)直接判断默认枚举值
如果不想新增None成员,也可以在switch前直接判断枚举值是否为0,返回0:
public decimal AccessoryCost { get { if ((int)_selectedAccessory == 0) return 0m; return _selectedAccessory switch { Accessories.Speakers => 505.05m, // 其他分支... _ => 0m }; } }
内容的提问来源于stack exchange,提问作者Seyi Agboola
相关产品推荐
相关产品推荐

