You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:10:27