C#中switch case判断List类型触发报错的问题
问题结论
C# 原生传统switch语句确实不支持直接将List、数组这类集合类型作为判断表达式,也不支持直接在case标签后写集合实例做等值匹配。
你收到的编译错误已经明确限定了switch支持的合法类型范围:仅支持bool、char、string、整数数值类型、枚举类型,以及上述类型对应的可空类型。List<int>属于泛型引用集合类型,不在合法类型范围内,因此直接编写会触发编译报错。
额外需要注意:就算忽略类型限制,你原本的写法也无法得到预期结果。List是引用类型,默认的等值判断逻辑是对比两个对象的内存引用地址是否一致,你在case标签中new出来的List实例和外部定义的Test变量指向完全不同的内存地址,永远不会匹配成功。
可实现同等逻辑的替代写法
- 转换为switch支持的基础类型后匹配
最通用的兼容写法是先把集合按固定规则转换成字符串等switch支持的类型,再做分支判断,示例代码如下:List<int> Test = new List<int>(){9, 6, 5}; // 将集合元素按固定分隔符拼接为字符串,作为匹配依据 string matchKey = string.Join(",", Test); switch(matchKey) { case "9,6,5": Console.Write("Yes"); break; case "2,4,8": Console.Write("No"); break; } - 结合类型模式+when子句匹配(C# 7.0及以上支持)
高版本C#的switch支持模式匹配能力,可以先判断对象类型,再通过when条件子句校验集合的元素内容,使用SequenceEqual方法判断两个集合的元素顺序、值是否完全一致,示例代码如下:List<int> Test = new List<int>(){9, 6, 5}; switch(Test) { case List<int> target when target.SequenceEqual(new List<int>{9,6,5}): Console.Write("Yes"); break; case List<int> target when target.SequenceEqual(new List<int>{2,4,8}): Console.Write("No"); break; } - 直接使用列表模式匹配(C# 11及以上支持)
C# 11新增了列表模式特性,可以直接对集合的元素结构做匹配,写法最简洁,和你原本的预期写法逻辑完全一致:List<int> Test = new List<int>(){9, 6, 5}; switch(Test) { case [9,6,5]: Console.Write("Yes"); break; case [2,4,8]: Console.Write("No"); break; }
内容的提问来源于stack exchange,提问作者Pacifa
相关产品推荐
相关产品推荐

