Расширенные шаблоны свойств
Заметка
Эта статья является спецификацией компонентов. Спецификация служит проектным документом для функции. Он включает предлагаемые изменения спецификации, а также информацию, необходимую во время проектирования и разработки функции. Эти статьи публикуются до тех пор, пока предложенные изменения спецификации не будут завершены и включены в текущую спецификацию ECMA.
Может возникнуть некоторое несоответствие между спецификацией компонентов и завершенной реализацией. Эти различия фиксируются в соответствующих заметках по дизайну языка (LDM).
Дополнительные сведения о процессе внедрения спецификаций функций в стандарт языка C# см. в статье о спецификациях .
Проблема чемпиона: https://github.com/dotnet/csharplang/issues/4394
Сводка
Разрешить подшаблонам свойств ссылаться на вложенные члены, например:
if (e is MethodCallExpression { Method.Name: "MethodName" })
Вместо:
if (e is MethodCallExpression { Method: { Name: "MethodName" } })
Мотивация
Если вы хотите соответствовать свойству дочернего элемента, вложение другого рекурсивного шаблона добавляет слишком много шума, что ухудшает читаемость без реальных преимуществ.
Подробный дизайн
Синтаксис property_pattern изменяется следующим образом:
property_pattern
: type? property_pattern_clause simple_designation?
;
property_pattern_clause
: '{' (subpattern (',' subpattern)* ','?)? '}'
;
subpattern
- : identifier ':' pattern
+ : subpattern_name ':' pattern
;
+subpattern_name
+ : identifier
+ | subpattern_name '.' identifier
+ ;
Получатель для каждого поиска имени — это тип предыдущего члена T0, начиная с входного типа шаблона свойства . Если T является обнуляемым типом, T0 является его базовым типом, в противном случае T0 равно T.
Например, шаблон формы { Prop1.Prop2: pattern }
точно эквивалентен { Prop1: { Prop2: pattern } }
.
Обратите внимание, что это будет включать проверку null, если T является типом значений, допускающим значение NULL, или ссылочным типом. Эта проверка null означает, что доступные вложенные свойства будут свойствами T0, а не T.
Разрешены повторяющиеся пути к элементу. Компиляция сопоставления шаблонов может использовать общие элементы шаблонов.
C# feature specifications