Switch语句结合List对象使用时编译报错问题求助
问题描述
原本直接硬编码字符串用switch分支控制程序流程时运行正常,将这些字符串存入List后,用List元素作为switch的case分支判断,编译器报错:
type or namespace lDetailing could not be found.
但代码中此前还能正常引用该List,相关代码如下:
private List<string> lDetailing = new List<string>() { "Engineering", "Internal", "Attorney", "Estimate" }; // 从记录集中获取字段名 string sFieldName = dr.Field<string>(1); // 使用switch语句匹配对应的List元素 switch(sFieldName) { case lDetailing[0]: iFieldNum = 0; break; case lDetailing[1]: iFieldNum = 55; break; case lDetailing[2]: iFieldNum = 99; break; }
原因及解决办法
C#的switch case分支要求case标签必须是编译时常量,而lDetailing[0]这类List元素是运行时才能确定的值,不符合语法要求,这就是报错的核心原因。
可以用以下几种方式解决:
- 改用const常量定义:把需要匹配的字符串定义为编译时常量,就能在switch中正常使用:
private const string Engineering = "Engineering"; private const string Internal = "Internal"; private const string Attorney = "Attorney"; switch(sFieldName) { case Engineering: iFieldNum = 0; break; case Internal: iFieldNum = 55; break; case Attorney: iFieldNum = 99; break; }
- 改用Dictionary映射+判断:如果要保留集合式的管理方式,用Dictionary存储字符串与对应数值的映射,通过查找字典替代switch:
private Dictionary<string, int> fieldMap = new Dictionary<string, int>() { {"Engineering", 0}, {"Internal", 55}, {"Attorney", 99} }; // 查找匹配值 if(fieldMap.TryGetValue(sFieldName, out int num)) { iFieldNum = num; } else { // 处理未匹配的情况 }
- C# 7.0+的switch表达式:如果使用较新版本的C#,可以用switch表达式实现更简洁的匹配逻辑:
iFieldNum = sFieldName switch { "Engineering" => 0, "Internal" => 55, "Attorney" => 99, _ => iFieldNum // 默认值,或根据需求抛出异常 };
内容的提问来源于stack exchange,提问作者SQL Pup
相关产品推荐
相关产品推荐

