Patrones de propiedades extendidos
Nota
Este artículo es una especificación de características. La especificación actúa como documento de diseño de la característica. Incluye cambios de especificación propuestos, junto con la información necesaria durante el diseño y el desarrollo de la característica. Estos artículos se publican hasta que se finalizan los cambios de especificación propuestos e se incorporan en la especificación ECMA actual.
Puede haber algunas discrepancias entre la especificación de características y la implementación completada. Esas diferencias se recogen en las notas de la reunión de diseño de lenguaje (LDM) correspondientes.
Puede obtener más información sobre el proceso de adopción de especificaciones de características en el estándar del lenguaje C# en el artículo sobre las especificaciones de .
Problema planteado por el experto: https://github.com/dotnet/csharplang/issues/4394
Resumen
Permitir que los subpatrones de propiedades puedan referirse a miembros anidados, por ejemplo:
if (e is MethodCallExpression { Method.Name: "MethodName" })
En lugar de:
if (e is MethodCallExpression { Method: { Name: "MethodName" } })
Motivación
Si desea hacer coincidir una propiedad secundaria, el anidamiento de otro patrón recursivo agrega demasiado ruido que dañará la legibilidad sin ninguna ventaja real.
Diseño detallado
La sintaxis property_pattern se modifica de la siguiente manera:
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
+ ;
El receptor de cada búsqueda de nombres es el tipo del miembro anterior T0, empezando por el tipo de entrada del property_pattern. si T es un tipo que acepta valores NULL, T0 es su tipo subyacente; de lo contrario, T0 es igual a T.
Por ejemplo, un patrón del formulario { Prop1.Prop2: pattern }
es exactamente equivalente a { Prop1: { Prop2: pattern } }
.
Tenga en cuenta que esto incluirá la comprobación de nulidad cuando T sea un tipo de valor que admite valores nulos o un tipo de referencia. Esta verificación de nulidad indica que las propiedades anidadas disponibles serán las propiedades de T0, no de T.
Se permiten rutas de acceso de miembro repetidas. La compilación de la coincidencia de patrones puede aprovechar las partes comunes de los patrones.
C# feature specifications