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

记录位置模式匹配中为何“..”切片语法无法生效?

为什么位置模式匹配中“..”切片语法在记录类型上不生效?

我原本预期在使用位置模式匹配时,“..”(切片)语法能像在数组元素中一样生效,但实际测试时无法正常工作。以下是示例代码:

// Create and populate a record
var vehicle = new VehicleData(2, "Model Y", 99_990M, 5, 3.5M);

// Record, deconstruct, and positional pattern matching
var bestForCustomer = vehicle switch
{
    (_, "Model Y", ..) => "Best for small family",            // Doesn't work
    (_, "Model X", _, _, _) => "Best for large family",       // _ does work
    (_, "Model X Plaid", _, _, _) => "Best for performance",
    _ => "Best for price"
};

请问为何“..”(切片)语法在此场景下无法生效?


原因解释

C#里位置模式中的..(范围模式)和数组切片的语法逻辑不一样,它有严格的位置限制:

  • ..只能出现在位置模式的最开头或最结尾,用来匹配“开头的所有元素”或“结尾的所有元素”,不能夹在两个具体匹配项中间。
  • 你写的(_, "Model Y", ..)把..放在了第二个匹配项之后,属于中间位置,违反了语法规则,所以无法通过编译。
  • 而_是单个元素的通配符,没有位置限制,所以用多个_占位后续元素的写法是合法的。

解决方法

有两种方式可以实现你想要的匹配逻辑:

方法1:继续使用通配符_占位

直接用_代替后续的每个元素,写法简单兼容所有支持位置模式的C#版本:

var bestForCustomer = vehicle switch
{
    (_, "Model Y", _, _, _) => "Best for small family",
    (_, "Model X", _, _, _) => "Best for large family",
    (_, "Model X Plaid", _, _, _) => "Best for performance",
    _ => "Best for price"
};

方法2:使用C# 12+的列表模式

如果你的项目使用C# 12及以上版本,可以用列表模式(方括号语法)来匹配,这种模式允许..出现在任意位置,更灵活:

var bestForCustomer = vehicle switch
{
    [_, "Model Y", ..] => "Best for small family",
    [_, "Model X", ..] => "Best for large family",
    [_, "Model X Plaid", ..] => "Best for performance",
    _ => "Best for price"
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:03:13