Поделиться через


Расширенные шаблоны свойств

Заметка

Эта статья является спецификацией компонентов. Спецификация служит проектным документом для функции. Он включает предлагаемые изменения спецификации, а также информацию, необходимую во время проектирования и разработки функции. Эти статьи публикуются до тех пор, пока предложенные изменения спецификации не будут завершены и включены в текущую спецификацию 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.

Разрешены повторяющиеся пути к элементу. Компиляция сопоставления шаблонов может использовать общие элементы шаблонов.