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

.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错误
}

错误原因

  1. 语法错误:.. 和 var lastOddNumber 之间缺失逗号,导致模式结构不合法;
  2. 编译器跟踪限制:将模式匹配结果赋值给单独的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}");
}

修正要点

  1. 补全..与var lastOddNumber之间缺失的逗号,修复语法错误;
  2. 将列表模式直接写入if条件中,让编译器明确:只有模式匹配成功时才会进入代码块,此时捕获的变量必然已完成赋值,从而消除编译错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:55:44