数组的数组与可为空引用类型结合时的编译问题问询
关于C#可为空复合数组类型编译错误的问题解答
这是C#编译器在处理可为空引用类型与复合数组类型组合时的已知bug,在C# 8、9的早期版本中普遍存在。
问题核心
- C#语法里的数组括号写法(比如
string[,]代表二维数组)和.NET运行时IL层面的类型表示顺序本来就有差异,但常规使用时编译器会自动适配,不会出问题。 - 启用可为空引用类型后,如果给“数组的数组”里的内层数组加可为空标记(比如写
string[,]?[],意思是一个一维数组,它的每个元素是可空的二维string数组),编译器会错误抛出CS0022编译错误,提示索引数量不匹配,但实际上这个类型的秩和代码里的索引使用是完全匹配的。 - 反过来调整括号和可为空标记的顺序(比如写成
string[,][]?,代表一个可空的、元素为二维string数组的一维数组)就能正常编译,但这其实是绕开了编译器的解析bug,并不是符合原需求的写法。 - 另外,错误写法如果强行编译(比如通过某些非正规方式),生成的IL类型顺序会乱掉,这也证明编译器在处理这类复合类型的可为空标记时,语法解析逻辑有漏洞。
修复状态
这类问题在C# 10及之后的版本里已经被官方修复,编译器能正确识别T[,]?[]这类复合可空数组类型,不会再触发错误的CS0022提示,生成的IL类型也符合预期。
内容的提问来源于stack exchange,提问作者Jeppe Stig Nielsen
相关产品推荐
相关产品推荐

