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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 15:22:10