.NET 7列表模式捕获变量时触发CS0165未赋值局部变量错误
C#列表模式捕获变量时的CS0165编译错误分析与解决
在LINQPad 7与.NET 7.0.1环境中测试C#列表模式时,遇到了编译错误问题。先明确列表模式的基础用法:
_表示忽略对应位置的元素..表示匹配指定索引间的任意元素
尝试在列表模式中捕获变量时,触发了CS0165“使用未赋值局部变量”编译错误:即便通过if判断匹配结果,仍无法访问捕获的变量,但调试时可见变量已被赋值。
错误代码示例
var someOddNumbers = new int[] { 1, 3, 5, 7, 9, 11 }; bool resultX = someOddNumbers is [1, 3, _, _, _, 11]; resultX.Dump("The 'someOddNumbers' equals a sequence of numbers 1,3,then three arbitrary numbers, then 11?"); bool isOdd = someOddNumbers is [1, .., 9, 11]; isOdd.Dump("The 'someOddNumbers' equals a sequence of numbers 1, some arbitrary numbers, then ending with 9 and 11?"); bool result = someOddNumbers is [var firstOddNumber,.. , var lastOddNumber]; // ..与var lastOddNumber间缺失逗号 if (result) { Console.WriteLine($"The captured variables are: {firstOddNumber} and {lastOddNumber}"); // 触发CS0165错误 }
错误原因
- 语法错误:
..和var lastOddNumber之间缺失逗号,导致模式结构不合法; - 编译器跟踪限制:将模式匹配结果赋值给单独的
result变量后,编译器无法关联result为true与firstOddNumber、lastOddNumber已赋值的逻辑关系,因此判定变量可能未赋值。
修正后代码
var someOddNumbers = new int[] { 1, 3, 5, 7, 9, 11 }; bool resultX = someOddNumbers is [1, 3, _, _, _, 11]; resultX.Dump("The 'someOddNumbers' equals a sequence of numbers 1,3,then three arbitrary numbers, then 11?"); bool isOdd = someOddNumbers is [1, .., 9, 11]; isOdd.Dump("The 'someOddNumbers' equals a sequence of numbers 1, some arbitrary numbers, then ending with 9 and 11?"); if (someOddNumbers is [var firstOddNumber, .. , var lastOddNumber]){ Console.WriteLine($"The captured variables are: {firstOddNumber} and {lastOddNumber}"); }
修正要点
- 补全
..与var lastOddNumber之间缺失的逗号,修复语法错误; - 将列表模式直接写入if条件中,让编译器明确:只有模式匹配成功时才会进入代码块,此时捕获的变量必然已完成赋值,从而消除编译错误。
内容的提问来源于stack exchange,提问作者Tore Aurstad
相关产品推荐
相关产品推荐

