我本以为会有"(slice)语法在使用位置模式匹配时起作用,就像它对数组元素所做的那样。
下面是我的例子:
// 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"
};
有人知道为什么…(切片)语法不工作在这种情况下?
您正在尝试在模式匹配中使用..
(slice),但此语法是列表模式的一部分。对于记录使用这种语法是不可接受的,只有对于具有可访问索引器的类型,该索引器以Range
作为参数,或者具有两个int
参数的可访问Slice
方法。
下面是列表模式文档中的一段话:
list_pattern
兼容任何类型的countable
和indexable
——它有一个可访问索引器,以Index
作为参数,或者一个可访问索引器,只有一个int
参数。如果两个索引器都存在,则首选前者。带子模式的
slice_pattern
兼容countable
和sliceable
的任何类型——它有一个可访问的索引器,以Range
作为参数,或者一个可访问的Slice
方法,带两个int
参数。如果两者都存在,则首选前者。没有子模式的
slice_pattern
与任何与list_pattern
兼容的类型都是兼容的。
因此,您只能使用丢弃模式_
作为您想要忽略的元素的占位符。
还要注意列表模式只在c# 11及以后的版本中工作。