Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El compilador de C# genera errores cuando se usan mal los tipos de unión o las jerarquías de tipos cerrados. Un tipo de unión representa un valor que puede ser uno de varios tipos de casos, con conversiones implícitas y coincidencias exhaustivas de patrones. Las jerarquías cerradas restringen qué tipos pueden derivar de un tipo base. Estos diagnósticos le ayudan a seguir las reglas para declarar y usar tipos de unión y jerarquías cerradas.
- CS9370: una declaración de unión debe especificar al menos un tipo de caso.
- CS9371: No se puede convertir el tipo en "object" a través de una referencia implícita o conversión boxing.
- CS9373: los campos de instancia, las propiedades automáticas o los eventos similares a campos no se permiten en una declaración "union".
- CS9374: No se permiten constructores públicos declarados explícitamente con un único parámetro en una declaración de 'union'.
- CS9375: un constructor declarado en una declaración "union" debe tener un inicializador "this" que llame a un constructor sintetizado o a un constructor declarado explícitamente.
- CS9380: Los tipos y alias no se pueden denominar "closed".
- CS9381: 'type': un tipo cerrado no puede ser sellado ni estático
- CS9382: 'type': no se puede usar un tipo cerrado 'type' de otro ensamblado como un tipo base.
- CS9383: 'type': se debe hacer referencia al parámetro de tipo 'parameter' en el tipo base 'type' porque el tipo base está cerrado.
- CS9384: 'type': un tipo cerrado no se puede marcar como abstracto porque siempre es implícitamente abstracto.
- CS9385: un tipo de unión debe tener al menos un miembro de creación de unión.
- CS9386: Un tipo de proveedor de miembro de una unión debe tener una propiedad de instancia "Value" de tipo "object?" u "object". La propiedad debe tener un descriptor de acceso get público.
- CS9387: Una declaración "union" no puede usar una interfaz de proveedor de miembros de una unión.
Requisitos de declaración de unión
- CS9370: una declaración de unión debe especificar al menos un tipo de caso.
- CS9371: No se puede convertir el tipo en "object" a través de una referencia implícita o conversión boxing.
Una declaración de unión especifica un nombre y una lista de tipos de casos. Estos errores imponen los requisitos estructurales necesarios para una declaración de unión válida. Para obtener las reglas completas, consulte la especificación de características de tipos de unión.
Para corregir estos errores, aplique los siguientes cambios a la declaración de unión:
- Agregue al menos un tipo de caso a la lista de tipos de la unión (CS9370). Una unión debe tener uno o varios tipos de casos porque el propósito de la unión es representar un conjunto cerrado de alternativas. Una declaración como
union Empty()sin tipos de casos no es significativa. - Cambie o quite los tipos de casos que no se convierten a
objectmediante una referencia implícita o conversión boxing (CS9371). Los tipos de unión almacenan su contenido como una única referenciaobject?, por lo que cada uno de los tipos de caso debe ser convertible aobject. Los punteros o tipos comoref structno cumplen este requisito. Reemplácelas por un tipo contenedor que se puede colocar o almacenar como referencia.
Restricciones para los miembros del sindicato
- CS9373: los campos de instancia, las propiedades automáticas o los eventos similares a campos no se permiten en una declaración "union".
- CS9374: no se permiten constructores públicos declarados explícitamente con un único parámetro en una declaración "union".
- CS9375: un constructor declarado en una declaración "union" debe tener un inicializador "this" que llame a un constructor sintetizado o a un constructor declarado explícitamente.
Una declaración de unión puede incluir un cuerpo con miembros adicionales, pero el compilador restringe lo que se puede declarar. Estas restricciones garantizan que los constructores de conversión generados por el compilador y el mecanismo de almacenamiento funcionen correctamente. Para obtener las reglas completas, consulte la especificación de características de tipos de unión.
Para corregir estos errores, aplique los siguientes cambios a los miembros de la unión:
- Quite campos de instancia, propiedades implementadas automáticamente y eventos similares a campos del cuerpo de la unión (CS9373). Una unión no define nuevos miembros de datos. Compone tipos existentes en un conjunto cerrado de alternativas. Declare cualquier estado adicional en los propios tipos de caso o use miembros estáticos en la unión.
- Quite o cambie la accesibilidad de cualquier constructor público declarado explícitamente que tome un único parámetro (CS9374). El compilador genera un constructor público de parámetro único para cada tipo de caso para admitir conversiones de unión implícitas. Un constructor explícito con la misma forma entra en conflicto con los constructores generados. Si necesita un constructor de un solo parámetro, consítelo
internaloprivate. - Agregue un
thisinicializador a cualquier constructor declarado explícitamente para que se encadene a un constructor sintetizado u otro constructor declarado explícitamente (CS9375). Los constructores generados por el compilador inicializan correctamente el almacenamiento interno de la unión. Los constructores que no se encadenan a través de ellos podrían dejar la unión en un estado no válido. Use: this(someValue)para encadenar a un constructor de tipo de caso generado o: this()para encadenar a un constructor sin parámetros explícito que declare.
Requisitos para proveedores miembros de la unión
- CS9385: Un tipo de unión debe tener al menos un miembro de creación de la unión.
- CS9386: un tipo de proveedor de miembro de una unión debe tener una propiedad de instancia "Value" de tipo "object?" u "object". La propiedad debe tener un descriptor de acceso get público.
- CS9387: una declaración "unión" no puede usar una interfaz de proveedor de miembros de una unión.
Un proveedor de miembros de una unión es un tipo que implementa el patrón de unión mediante una interfaz en lugar de la palabra clave union. Estos errores imponen los requisitos estructurales para los tipos que participan en el patrón de proveedor de miembros de unión. Para obtener las reglas completas, consulte la especificación de características de tipos de unión.
Para corregir estos errores, aplique los siguientes cambios al proveedor de miembros de la unión:
- Agregue al menos un miembro de creación de unión al tipo (CS9385). Un tipo unión debe exponer al menos un miembro para la creación (como un método de fábrica estático o una conversión implícita) para que los valores de la unión se puedan crear a partir de los tipos de caso.
- Agregue una propiedad de instancia
Valuepública de tipoobject?oobjectcon un descriptor de acceso públicogetal tipo de proveedor de miembros (CS9386). La propiedadValuees la forma en que el tiempo de ejecución recupera el valor almacenado desde la unión. Sin ella, la unión no puede hacer accesible su contenido para la comprobación de patrones ni para acceder directamente a él. - Quite la interfaz del proveedor de miembros de unión de la
uniondeclaración (CS9387). Unauniondeclaración sintetiza su propia implementación del proveedor de miembros. No se puede especificar una interfaz de proveedor para un miembro de unión en un tipo que use directamente la palabra claveunion. Use la interfaz del proveedor de miembros solo en los tipos que implementan el patrón de unión manualmente.
Restricciones de jerarquía cerradas
-
CS9380: Los tipos y alias no se pueden denominar
closed. - CS9381: "type": un tipo cerrado no puede sellarse ni estático
- CS9382: 'type': no se puede usar un tipo cerrado 'type' de otro ensamblado como un tipo base.
- CS9383: 'type': se debe hacer referencia al parámetro de tipo 'parameter' en el tipo base 'type' porque el tipo base está cerrado.
- CS9384: 'type': un tipo cerrado no se puede marcar como abstracto porque siempre es implícitamente abstracto.
Una jerarquía de tipos cerrada restringe los tipos que pueden derivar de un tipo base. El compilador aplica estas restricciones para asegurarse de que el conjunto de tipos derivados es conocido y exhaustivo. Para obtener las reglas completas, consulte la especificación de características de jerarquías cerradas.
Para corregir estos errores, aplique los siguientes cambios a la declaración de jerarquía cerrada:
- Cambie el nombre de cualquier tipo o alias denominado
closed, porqueclosedes una palabra clave reservada en este contexto (CS9380). Elija otro nombre que no entre en conflicto con la palabra clave . - Quite el modificador
sealedostaticde un tipo cerrado (CS9381). Un tipo cerrado es implícitamente abstracto (debe derivarse de), por lo que marcarlosealed(lo que impide la derivación) ostatic(lo que impide la creación de instancias y derivación) contradiga su propósito. - No derive de un tipo cerrado declarado en otro ensamblado (CS9382). Las jerarquías cerradas deben tener todos sus subtipos definidos en el mismo ensamblado que el tipo base. Esta restricción permite al compilador realizar una coincidencia exhaustiva de patrones. Mueva el tipo derivado al mismo ensamblado que el tipo base cerrado o quite la relación de herencia.
- Asegúrese de que cada parámetro de tipo de un subtipo genérico aparezca en la referencia de tipo base cuando se cierre el tipo base (CS9383). Dado que una jerarquía cerrada requiere un conocimiento exhaustivo de todos los subtipos, todos los parámetros de tipo de un subtipo deben restringirse a través del tipo base. Si no se hace referencia a un parámetro de tipo en el tipo base, el compilador no puede enumerar todas las instancias posibles.
- Quite el
abstractmodificador de una declaración de tipo cerrada (CS9384). Un tipo cerrado siempre es implícitamente abstracto porque actúa como base para un conjunto finito de tipos derivados. Agregarabstractexplícitamente es redundante y no permitido para evitar confusiones sobre si el tipo tiene una semántica diferente a otros tipos cerrados.