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
相关产品推荐
相关产品推荐

