记录位置模式匹配中为何“..”切片语法无法生效?
为什么位置模式匹配中“..”切片语法在记录类型上不生效?
我原本预期在使用位置模式匹配时,“..”(切片)语法能像在数组元素中一样生效,但实际测试时无法正常工作。以下是示例代码:
// 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
相关产品推荐
相关产品推荐

