Compartir a través de


Resolución de errores y advertencias en expresiones de coincidencia de patrones

En este artículo se tratan los siguientes errores y advertencias del compilador:

  • CS8116: no es legal usar el tipo que acepta valores NULL en un patrón; use el tipo subyacente en su lugar.
  • CS8117: operando no válido para la coincidencia de patrones; valor necesario, pero expresión encontrada.
  • CS8119: la expresión switch debe ser un valor; expresión encontrada.
  • CS8120: El caso del switch no es alcanzable. Ya ha sido manejado por un caso previo o es imposible que coincida.
  • CS8121: una expresión de tipo de origen no se puede controlar mediante un patrón de tipo de destino.
  • CS8208: no es legal usar el tipo "dinámico" en un patrón.
  • CS8502: La coincidencia con el tipo de tupla requiere subpatrones anotados, pero hay subpatrones incorrectos.
  • CS8503: Un subpatrón de propiedad requiere una referencia a la propiedad o al campo para coincidir, por ejemplo, '{{ Name: value }}'
  • CS8504: Patrón que falta
  • CS8505: un literal predeterminado 'default' no es válido como patrón. Use otro literal (por ejemplo, "0" o "null") según corresponda. Para hacer coincidir todo, use un patrón de descarte '_'.
  • CS8506: no se encontró ningún tipo mejor para la expresión switch.
  • CS8508: la sintaxis "var" de un patrón no puede hacer referencia a un tipo, pero var el tipo está en el ámbito aquí.
  • CS8509: la expresión switch no controla todos los valores posibles de su tipo de entrada (no es exhaustivo). Por ejemplo, el patrón '...' no está cubierto.
  • CS8510: El patrón es inalcanzable. Ya ha sido manejado por un brazo anterior de la expresión switch o no se puede coincidir.
  • CS8512: el nombre '_' hace referencia a la constante, no al patrón de descarte. Use 'var _' para descartar el valor o '@_' para hacer referencia a una constante por ese nombre.
  • CS8513: el nombre '_' hace referencia al tipo _, no al patrón de descarte. Use '@_' para el tipo o 'var _' para descartar.
  • CS8515: se requieren paréntesis alrededor de la expresión de control del conmutador.
  • CS8516: el nombre no identifica un elemento de tupla "{1}".
  • CS8517: el nombre no coincide con el parámetro "Deconstruct" correspondiente.
  • CS8518: una expresión de este tipo nunca puede coincidir con el patrón proporcionado.
  • CS8519: la expresión dada nunca coincide con el patrón proporcionado.
  • CS8520: la expresión dada siempre coincide con la constante proporcionada.
  • CS8521: no se permite la coincidencia de patrones para los tipos de puntero.
  • CS8522: los nombres de elementos no se permiten cuando la coincidencia de patrones se realiza mediante "System.Runtime.CompilerServices.ITuple".
  • CS8523: el patrón de descarte no se permite como etiqueta de caso en una instrucción switch. Use "case var _:" para un patrón de descarte o "case @_:" para una constante denominada "_".
  • CS8524: la expresión switch no controla algunos valores de su tipo de entrada (no es exhaustivo) que implica un valor de enumeración sin nombre.
  • CS8525: un designador de variables debe aparecer después de un patrón de propiedad.
  • CS8780: es posible que una variable no se declare dentro de un patrón "not" o "or".
  • CS8781: es posible que no se usen patrones relacionales para un valor de este tipo.
  • CS8782: es posible que no se usen patrones relacionales para naN de punto flotante.
  • CS8793: la expresión dada siempre coincide con el patrón proporcionado.
  • CS8794: una expresión de tipo '{0}' siempre coincide con el patrón proporcionado.
  • CS8846: la expresión switch no controla todos los valores posibles de su tipo de entrada (no es exhaustivo). Por ejemplo, este patrón no está cubierto. Sin embargo, un patrón con una cláusula "when" podría coincidir correctamente con este valor.
  • CS8918: se esperaba un identificador o un acceso de miembro simple.
  • CS8978: '...' no se puede hacer que admita valores NULL.
  • CS8979: es posible que no se usen patrones de lista para un valor de tipo '...'.
  • CS8980: los patrones de segmento solo se pueden usar una vez y directamente dentro de un patrón de lista.
  • CS8985: es posible que no se usen patrones de lista para un valor de tipo '...'. No se encontró ninguna propiedad 'Length' o 'Count'.
  • CS9013: no se admite una constante "null" de cadena como patrón para "...". Use una cadena vacía en su lugar.
  • CS9060: No se puede usar una constante numérica o un patrón relacional en '...' porque hereda de o extiende "INumberBase<T>". Considere la posibilidad de usar un patrón de tipo para restringir a un tipo numérico específico.
  • CS9134: un brazo de expresión switch no comienza con una palabra clave "case".
  • CS9135: se espera un valor constante de tipo
  • CS9336: el patrón es redundante.
  • CS9337: el patrón es demasiado complejo para analizar la redundancia.
  • CS9344: el operador '==' no se admite en un patrón.
  • CS9345: El operador '!=' no se admite en un patrón. Use 'not' para representar un patrón negado.

Errores de sintaxis de expresión de switch

  • CS8119: la expresión switch debe ser un valor; expresión encontrada.
  • CS8504: Patrón que falta
  • CS8505: un literal predeterminado 'default' no es válido como patrón. Use otro literal (por ejemplo, "0" o "null") según corresponda. Para hacer coincidir todo, use un patrón de descarte '_'.
  • CS8506: no se encontró ningún tipo mejor para la expresión switch.
  • CS8515: se requieren paréntesis alrededor de la expresión de control del conmutador.
  • CS8523: el patrón de descarte no se permite como etiqueta de caso en una instrucción switch. Use "case var _:" para un patrón de descarte o "case @_:" para una constante denominada "_".
  • CS9134: un brazo de expresión switch no comienza con una palabra clave "case".
  • CS9135: se espera un valor constante de tipo
  • CS9344: el operador '==' no se admite en un patrón.
  • CS9345: El operador '!=' no se admite en un patrón. Use 'not' para representar un patrón negado.

Proporcione un valor como expresión de gobernanza de una switch instrucción o expresión (CS8119). La expresión de gobierno debe generar un valor. Los tipos, los espacios de nombres, los grupos de métodos y los métodos que devuelven void no son válidos. Use una expresión que se evalúe como un valor.

Proporcione un patrón donde se espera uno (CS8504). Un brazo de conmutador o una expresión de is requiere un patrón después de la sintaxis adecuada. Asegúrese de incluir una expresión de patrón válida.

No use el default literal como patrón (CS8505). La default palabra clave no es válida en la coincidencia de patrones. Use un valor literal específico como 0 o null , en su lugar, o use el patrón _ de descarte para que coincida con cualquier valor.

Especifique un tipo explícito para el resultado de la expresión switch cuando el compilador no pueda deducir el mejor tipo de los brazos (CS8506). Este error se produce cuando los brazos devuelven valores de diferentes tipos que no comparten un tipo común que el compilador puede deducir automáticamente, como grupos de métodos o lambdas. Asigne el resultado a una variable con tipo explícito en lugar de usar var.

Incluya la expresión controladora de una switch sentencia entre paréntesis y el cuerpo entre llaves (CS8515). La switch instrucción requiere paréntesis alrededor de la expresión que se va a evaluar y llaves alrededor del cuerpo. Este error se produce cuando faltan paréntesis o llaves.

Use case var _: en lugar del descarte simple _ como etiqueta de caso en una switch instrucción (CS8523). El patrón de descarte simple no se permite en las instrucciones switch debido a la ambigüedad con una constante llamada _. Use case var _: para un descarte o case @_: para que coincida con una constante denominada _.

Quite la palabra clave case de los brazos de expresión de conmutador. Las expresiones switch usan una sintaxis diferente a las instrucciones switch (CS9134). En las expresiones switch, cada brazo consta de un patrón seguido del símbolo => y una expresión, sin la palabra clave case que se utiliza en las instrucciones switch. Use valores constantes en lugar de variables en patrones. La coincidencia de patrones requiere constantes en tiempo de compilación (CS9135). Las variables no se pueden usar como patrones. El compilador debe conocer los valores exactos en tiempo de compilación para generar el código coincidente adecuado.

Use operadores de patrón relacional (<, >, <=, >=) o la palabra clave not en lugar de los operadores == y != en patrones (CS9344, CS9345). Los operadores de igualdad y desigualdad no se admiten en la sintaxis de patrón. Use un patrón constante para la igualdad y la not palabra clave para la desigualdad.

Para obtener más información sobre la sintaxis correcta, vea Expresión switch.

Completitud y redundancia de patrones

  • CS8120: El caso del switch es inalcanzable. Ya ha sido gestionado por un caso anterior o es imposible de coincidir.
  • CS8509: la expresión switch no controla todos los valores posibles de su tipo de entrada (no es exhaustivo). Por ejemplo, el patrón '...' no está cubierto.
  • CS8510: El patrón es inaccesible. Ya ha sido gestionado por un brazo anterior de la expresión switch o no es posible emparejar.
  • CS8518: una expresión de tipo nunca puede coincidir con el patrón proporcionado.
  • CS8519: la expresión dada nunca coincide con el patrón proporcionado.
  • CS8520: la expresión dada siempre coincide con la constante proporcionada.
  • CS8524: La expresión switch no controla algunos valores de su tipo de entrada (no es exhaustiva) debido a un valor de enumeración sin nombre. Por ejemplo, el patrón indicado no está cubierto.
  • CS8793: la expresión dada siempre coincide con el patrón proporcionado.
  • CS8794: una expresión de tipo siempre coincide con el patrón proporcionado.
  • CS8846: la expresión switch no controla todos los valores posibles de su tipo de entrada (no es exhaustivo). Por ejemplo, el patrón indicado no está cubierto. Sin embargo, un patrón con una cláusula "when" podría coincidir correctamente con este valor.
  • CS9336: el patrón es redundante.
  • CS9337: el patrón es demasiado complejo para analizar la redundancia.

Reordene o quite etiquetas de caso inaccesibles en declaraciones switch (CS8120). Una case etiqueta no es accesible cuando un caso anterior ya controla todos los valores que el caso posterior coincidiría. Esto ocurre cuando aparece un patrón más general antes de uno más específico o cuando el patrón es imposible coincidir con el tipo de entrada.

Agregue brazos switch que controle todos los valores de entrada posibles para crear expresiones de conmutador exhaustivas (CS8509, CS8524, CS8846). Las expresiones switch deben cubrir todos los valores posibles del tipo de entrada. De lo contrario, el compilador no puede garantizar que la expresión genere un resultado para todas las entradas. El compilador advierte por separado sobre los valores de enumeración sin nombre (CS8524) y en los casos en los que una cláusula when podría coincidir con un valor que de otro modo no se manejaría (CS8846). Usa el patrón de descarte (_) como un brazo universal final para que coincida con los valores restantes que no necesites manejar explícitamente.

Reordenar o quitar brazos de expresión de modificador inaccesibles (CS8510). Al igual que CS8120 para switch declaraciones, este error indica que un brazo de una expresión switch es inalcanzable porque un brazo anterior ya maneja todos los valores que el brazo posterior coincidiría.

Revise los patrones que nunca pueden coincidir o que siempre coincidan con la entrada (CS8518, CS8519, CS8520, CS8793, CS8794). Estos diagnósticos indican que el compilador puede determinar en tiempo de compilación si un patrón siempre o nunca coincide. Un patrón de coincidencia siempre es redundante y un patrón nunca coincidente es código fallido. Ambos pueden indicar errores lógicos.

Revise los patrones que el compilador identifica como redundante. Los patrones redundantes pueden indicar un error lógico en el que se pretendía usar not u otros operadores lógicos (CS9336). Simplifique patrones complejos que son demasiado difíciles para que el compilador analice la redundancia. Dividalas en expresiones más sencillas y fáciles de mantener (CS9337).

Para obtener más información sobre los requisitos de exhaustividad y la optimización de patrones, vea Expresión switch, Instrucción switch y Patrones.

Errores en patrones de tipos

  • CS8116: no es legal usar el tipo que acepta valores NULL en un patrón; use el tipo subyacente en su lugar.
  • CS8117: operando no válido para la coincidencia de patrones; valor necesario, pero expresión encontrada.
  • CS8121: una expresión de tipo de origen no se puede controlar mediante un patrón de tipo de destino.
  • CS8208: no es legal usar el tipo "dinámico" en un patrón.
  • CS8508: la sintaxis "var" de un patrón no puede hacer referencia a un tipo, pero var el tipo está en el ámbito aquí.
  • CS8513: el nombre '_' hace referencia al tipo _, no al patrón de descarte. Use '@_' para el tipo o 'var _' para descartar.
  • CS8521: no se permite la coincidencia de patrones para los tipos de puntero.
  • CS8781: es posible que no se usen patrones relacionales para un valor de tipo.
  • CS8782: es posible que no se usen patrones relacionales para naN de punto flotante.
  • CS8978: '...' no se puede hacer que admita valores NULL.
  • CS9060: No se puede usar una constante numérica o un patrón relacional en '...' porque hereda de o extiende "INumberBase<T>". Considere la posibilidad de usar un patrón de tipo para restringir a un tipo numérico específico.

Use el tipo subyacente en lugar del tipo que acepta valores NULL en patrones (CS8116). No se puede usar un tipo de valor que acepta valores NULL como int? directamente en un patrón de tipo. En su lugar, use el tipo subyacente (int), y el patrón coincide con valores anulables y no anulables.

Proporcione un valor como operando para una coincidencia de patrón (CS8117). El lado izquierdo de una is expresión debe ser un valor, no un tipo, un espacio de nombres o un grupo de métodos. Asigne primero el resultado a una variable o use una expresión diferente que genere un valor.

Use un tipo de patrón compatible con el tipo de expresión (CS8121). El compilador genera este error cuando no hay ninguna conversión posible entre el tipo de expresión y el tipo de patrón. Por ejemplo, no puede hacer coincidir una string expresión con un int patrón de tipo. Cambie el tipo de patrón a uno compatible con la expresión o convierta la expresión en un tipo compatible.

No use dynamic como tipo en un patrón (CS8208). El tipo dynamic no es compatible con la coincidencia de patrones. Use object en su lugar, o cambia el tipo del valor a uno específico antes de la comparación.

Cambie el nombre del tipo var o use un tipo explícito en el patrón (CS8508). Cuando un tipo denominado var está en el ámbito, la sintaxis de var patrón es ambigua. El compilador no puede determinar si quiere usar el var patrón o hacer referencia al tipo. Utilice el nombre de tipo totalmente calificado o cambie el nombre del tipo para evitar el conflicto.

Use @_ para hacer referencia a un tipo denominado _, o utiliza var _ para el patrón de descarte (CS8513). Cuando un tipo denominado _ está en el ámbito, el compilador no puede determinar si el patrón en _ hace referencia al tipo o al patrón de descarte.

No use la coincidencia de patrones con tipos de puntero (CS8521). Los tipos de puntero no se admiten en expresiones de coincidencia de patrones. Use comparaciones explícitas o conversiones en su lugar.

Use un tipo compatible con patrones relacionales (CS8781, CS8782). Los patrones relacionales (<, >, <=, >=) solo funcionan con tipos numéricos que admiten la comparación. No se pueden usar con valores NaN porque las comparaciones de NaN siempre devuelven false.

Utiliza el tipo subyacente directamente en patrones al trabajar con tipos que no pueden ser anulables (CS8978). Los tipos como System.Nullable<T>, los tipos de puntero y los tipos de estructura ref no se pueden hacer que sean null. Debe usar el tipo base en la lógica de coincidencia de patrones.

Use patrones de tipo para restringir los tipos numéricos genéricos a tipos numéricos específicos antes de aplicar constantes numéricas o patrones relacionales (CS9060). No puede coincidir con tipos numéricos genéricos que se implementan INumberBase<T> directamente mediante constantes numéricas o patrones relacionales. El compilador no puede determinar qué tipo numérico específico está siendo emparejado. Primero debe restringir el valor a un tipo numérico concreto como int, doubleo decimal.

Para obtener más información sobre los patrones de tipo, vea Tipos de valor que aceptan valores NULL, Patrones y Matemáticas genéricas.

Errores de patrón de lista

  • CS8979: es posible que no se usen patrones de lista para un valor de tipo '...'.
  • CS8980: los patrones de segmento solo se pueden usar una vez y directamente dentro de un patrón de lista.
  • CS8985: Es posible que no se puedan usar patrones de lista para un valor de tipo '...'. No se encontró una propiedad 'Length' o 'Count' adecuada.
  • CS9013: no se admite una constante "null" de cadena como patrón para "...". Use una cadena vacía en su lugar.

Asegúrese de que el tipo admite las operaciones necesarias para los patrones de lista. Los patrones de lista requieren tipos que son countables e indexables (CS8979, CS8985). es-ES: El tipo debe tener una propiedad, Length o Count, accesible y admitir la indexación. Los tipos en tiempo de ejecución que admiten patrones de lista incluyen matrices, List<T>, Span<T>y otros tipos de colección con miembros adecuados.

Coloque los patrones de segmento (..) directamente dentro de un patrón de lista. Úselos solo una vez por patrón de lista porque no pueden aparecer en patrones anidados o fuera de los patrones de lista (CS8980).

Al hacer coincidir tipos Span<char> o ReadOnlySpan<char>, use una cadena "" vacía en lugar de una constante de cadena nula. El literal null no se admite como un patrón para los tipos de span (CS9013).

Para obtener más información sobre los requisitos y la sintaxis de los patrones de lista, vea Patrones de lista y Patrones.

Errores de subpatrones

  • CS8502: La coincidencia con el tipo de tupla requiere subpatrones, pero hay subpatrones incorrectos.
  • CS8503: Un subpatrón de propiedad requiere que se haga referencia a la propiedad o al campo, por ejemplo, '{{ Name: value }}'
  • CS8512: el nombre '_' hace referencia a la constante, no al patrón de descarte. Use 'var _' para descartar el valor o '@_' para hacer referencia a una constante por ese nombre.
  • CS8516: El nombre no identifica el elemento de la tupla.
  • CS8517: el nombre no coincide con el parámetro "Deconstruct" correspondiente.
  • CS8522: los nombres de elementos no se permiten cuando la coincidencia de patrones se realiza mediante "System.Runtime.CompilerServices.ITuple".
  • CS8525: un designador de variables debe aparecer después de un patrón de propiedad.
  • CS8780: Una variable no puede declararse dentro de un patrón 'not' o 'or'.
  • CS8918: se esperaba un identificador o un acceso de miembro simple.

Proporcione el número correcto de subpatrones cuando coincida con un tipo de tupla (CS8502). El número de subpatrones de un patrón posicional debe coincidir con el número de elementos del tipo de tupla. Agregue o elimine subpatrones para coincidir con la aridad de la tupla.

Incluya el nombre de la propiedad o el nombre del campo en subpatrones de propiedad (CS8503). Cada subpatrón de propiedad debe especificar qué propiedad o campo debe corresponder. Use la sintaxis { PropertyName: pattern } para identificar el miembro.

Use var _ para el patrón de descarte o @_ para una constante denominada _ (CS8512). Cuando una constante denominada _ está en el ámbito, el elemento básico _ de una case etiqueta hace referencia a la constante. Para usar el patrón de descarte, escriba var _ en su lugar.

Utilice los nombres de elementos correctos en los patrones posicionales para las tuplas (CS8516) y tipos deconstruidos (CS8517). Al asignar nombres a subpatrones en un patrón posicional, los nombres deben coincidir con los nombres de elementos de tupla o los nombres de parámetros del Deconstruct método.

No uses nombres de elemento en patrones posicionales cuando hagas coincidencias a través de ITuple (CS8522). Cuando un tipo se corresponde mediante la ITuple interfaz en lugar de a través de un Deconstruct método, no hay elementos con nombre. Quite los nombres de elemento del patrón.

Coloque el designador de variables después del patrón de propiedad, no antes (CS8525). En un patrón de propiedad con una designación de variable, el nombre de la variable debe seguir el corchete de cierre del patrón. Por ejemplo, escriba { Length: > 0 } s en lugar de s { Length: > 0 }.

No se pueden declarar variables dentro de not o or con los combinadores de patrones (CS8780). Las declaraciones de variables en not patrones no se asignan definitivamente y las variables en or patrones solo se asignan en una sola rama. Mueva la declaración de variable fuera del combinador de patrones.

Use un identificador o una expresión de acceso de miembro simple como nombres de propiedad en patrones de propiedad y subpatrones posicionales (CS8918). Las expresiones complejas, las llamadas a métodos u otros accesos a miembros complejos no son válidos como lado izquierdo de un subpatrón de propiedad. Cada nombre de subpatrón debe ser una propiedad directa o un nombre de campo, o bien una ruta de acceso a miembros separada por puntos, como Property.SubProperty.

Para obtener más información sobre la sintaxis de subpatrones, vea Patrón de propiedades y Patrón posicional.