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

为什么C#中泛型数组与任意类型模式匹配不报编译错误

结论:这是C# Roslyn编译器的已知校验逻辑漏洞

编译不报错的原因

C# 模式匹配的编译期校验逻辑中,会先判断左值类型与右侧常量类型是否存在任何合法的转换路径(包括用户自定义转换、装箱/拆箱转换、继承转换等),如果确认完全不存在转换可能,才会抛出「模式匹配永远为假」的编译错误。
但当前编译器的校验逻辑存在遗漏:针对由泛型类型参数构造的数组类型(比如T[]、T[,]、T?[]等),不会执行上述跨类型的匹配有效性校验,哪怕你给泛型参数T添加了约束,编译器也不会判定数组类型和int、string等常量类型之间完全没有转换可能,因此不会提前抛出编译错误。

是否存在匹配成功的场景

不可能存在匹配成功的情况。
无论泛型参数T是什么类型,所有数组本质都是System.Array的子类,和int、string等非数组类型不存在任何继承、转换关系,运行时这一判断永远返回false,你写的分支逻辑永远不会被执行。

非泛型数组触发报错的原因

如果是string[]、int[]、object[]这类固定类型的数组,编译器可以直接确定该类型和右侧常量类型没有任何合法转换路径,因此会在编译期直接拦截这段无效代码,抛出错误。

可复现示例代码

T[] array = new T[42];
// 变量为任意维度的T构造数组时都可以复现该问题
if (array is 0 or "test") Console.WriteLine("This shouldn't even compile");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:36:03