Я ожидал, что синтаксис «..» (срез) будет работать при использовании позиционного сопоставления с образцом, как это происходит с элементами массива.
Вот мой пример:
// 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
в качестве аргумента или иным образом доступный Slice
метод с двумя int
параметрами.
Вот цитата из документации по шаблонам списков:
list_pattern
совместим с любым типом, который являетсяcountable
, а такжеindexable
— у него есть доступный индексатор, который принимаетIndex
в качестве аргумента, или доступный индексатор с одним параметромint
. Если присутствуют оба индексатора, предпочтение отдается первому.
slice_pattern
с подшаблоном совместим с любым типом, который являетсяcountable
, а такжеsliceable
— у него есть доступный индексатор, который принимаетRange
в качестве аргумента, или доступныйSlice
метод с двумя параметрамиint
. Если присутствуют оба, предпочтение отдается первому.
slice_pattern
без подшаблона совместим с любым типом, совместимым сlist_pattern
.
Таким образом, вы можете использовать только шаблон удаления_
в качестве заполнителя для элементов, которые вы хотите игнорировать.
Также обратите внимание, что шаблоны списков работают только в C# 11 и более поздних версиях.