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

C#中字符串枚举值用于Switch Case失效问题排查

问题分析与解决

你的代码无法正常运行的核心问题是case条件和输入字符串完全不匹配,具体问题点如下:

  • 第一个case里多了多余的冒号:,而且(char)AppType.DefaultApps是把int类型的枚举值1转为ASCII控制字符(不是字符串"1"),和输入的"1"完全不匹配。
  • 第二个、第三个case用nameof()获取的是枚举成员的名称(比如"GlobalApps"、"PrivateApps"),但你的输入是"3"、"L"这类枚举值对应的字符串,两者完全不对应。

解决方案1:将输入字符串转换为枚举类型后再switch

这种方式更规范,适合后续扩展:

// 处理PrivateApps的特殊情况:它的枚举值是char类型,实际存储为ASCII码76
if (appTypeString == "L")
{
    appTypeString = ((int)'L').ToString();
}

if (Enum.TryParse<AppType>(appTypeString, out var appType))
{
    switch (appType)
    {
        case AppType.DefaultApps:
            Console.WriteLine("Default Catalog Apps");
            break;
        case AppType.GlobalApps:
            Console.WriteLine("Global Catalog Apps");
            break;
        case AppType.PrivateApps:
            Console.WriteLine("Private Catalog Apps");
            break;
    }
}
else
{
    Console.WriteLine("Unknown App Type");
}

说明:PrivateApps的枚举值'L'会被隐式转换为对应的ASCII整数76,所以需要先把输入的"L"转成"76"再进行枚举解析。

解决方案2:直接匹配输入字符串的case条件

如果不想转换枚举,也可以直接在switch里写对应输入的字符串值:

switch (appTypeString)
{
    case "1":
        Console.WriteLine("Default Catalog Apps");
        break;
    case "3":
        Console.WriteLine("Global Catalog Apps");
        break;
    case "L":
        Console.WriteLine("Private Catalog Apps");
        break;
    default:
        Console.WriteLine("Unknown App Type");
        break;
}

这种方式更直接,但如果枚举值后续有修改,需要同步修改case里的字符串,维护性稍差。

内容的提问来源于stack exchange,提问作者Programmerzzz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:02:11