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.
En este artículo se tratan los siguientes errores del compilador:
- CS0071: Una implementación explícita de la interfaz para un evento debe usar la sintaxis del accesador de eventos.
- CS0106: el modificador no es válido para este elemento.
- CS0277: el miembro no implementa el miembro de interfaz porque no es público.
- CS0425: las restricciones para el parámetro de tipo del método deben coincidir con las restricciones para el parámetro de tipo del método de interfaz. Considere la posibilidad de usar una implementación de interfaz explícita en su lugar.
- CS0460: Las restricciones para los métodos de anulación y de implementación explícita de interfaz se heredan del método base, por lo que no se pueden especificar directamente a menos que se trate de una restricción "class" o "struct".
- CS0470: el método no puede implementar el descriptor de acceso de interfaz para el tipo. Use una implementación de interfaz explícita.
- CS0473: la implementación explícita de la interfaz "nombre del método" coincide con más de un miembro de interfaz. Qué miembro de interfaz se elige realmente depende de la implementación. Considere la posibilidad de usar una implementación no explícita en su lugar.
- CS0531: los miembros de la interfaz no pueden tener una definición.
- CS0535: El miembro no implementa al miembro de la interfaz.
- CS0538: Un miembro en una declaración explícita de Interfaz no es una Interfaz.
- CS0539: El miembro en la declaración explícita de la interfaz no se encuentra entre los miembros de la interfaz que se pueden implementar.
- CS0540: El tipo contenedor no implementa el miembro de la interfaz.
- CS0541: la declaración de interfaz explícita solo se puede declarar en una clase, registro, estructura o interfaz.
- CS0550: El miembro agrega un accesor no encontrado en el miembro de la interfaz.
- CS0551: Falta un accesor para la implementación explícita de la interfaz.
- CS0630: el miembro no puede implementar un miembro de interfaz porque tiene un parámetro __arglist.
- CS0686: El accesor no puede implementar el miembro de la interfaz. Use una implementación explícita de la interfaz.
- CS0736: el miembro no implementa el miembro de la interfaz de instancia. No puede implementar el miembro de interfaz porque es estático.
- CS0737: el miembro no implementa el miembro de interfaz. No puede implementar un miembro de interfaz porque no es público.
- CS0738: El elemento no implementa el miembro de interfaz. No puede hacerlo debido a que no tiene el tipo de retorno coincidente.
- CS8705: el miembro de interfaz no tiene una implementación más específica. Ninguno de los miembros es más específico.
- CS8854: Un miembro no implementa el miembro de la interfaz.
- CS9333: El tipo de parámetro debe coincidir con el miembro implementado.
- CS9334: El tipo de valor devuelto debe coincidir con el miembro implementado.
Declaración y sintaxis de interfaz
Los errores siguientes se relacionan con la sintaxis y la estructura adecuadas al declarar implementaciones de interfaz explícitas:
- CS0071: Una implementación de una interfaz explícita de un evento debe usar la sintaxis de acceso a eventos.
- CS0106: el modificador no es válido para este elemento.
- CS0531: los miembros de la interfaz no pueden tener una definición.
- CS0538: El miembro de una declaración explícita de interfaz no es una interfaz.
- CS0541: la declaración de interfaz explícita solo se puede declarar en una clase, registro, estructura o interfaz.
Puede corregir estos errores mediante las técnicas siguientes:
- Debe proporcionar manualmente los accesorios de eventos
addyremovecuando se implementa explícitamente un evento de interfaz (CS0071). El compilador no genera automáticamente estos descriptores de acceso para implementaciones de interfaz explícitas, por lo que debe definirlos explícitamente para especificar cómo se almacena y administra el evento. - Quite el
publicmodificador de implementaciones de interfaz explícitas (CS0106). Las implementaciones de interfaz explícitas son implícitamente públicas cuando se accede a través del tipo de interfaz, lo que hace que lapublicpalabra clave sea redundante y no se permita en este contexto. - Quite el
abstractmodificador de implementaciones de interfaz explícitas (CS0106). Las implementaciones de interfaz explícitas proporcionan la implementación real y no se pueden marcar como abstractas porque no se pueden invalidar en clases derivadas. - Elimine el cuerpo del método de las declaraciones de miembros de interfaz o traslade la implementación a una clase o estructura que implemente la interfaz (CS0531). Antes de C# 8.0, los miembros de la interfaz no pueden contener implementaciones; a partir de C# 8.0, puede proporcionar métodos de interfaz predeterminados mediante una sintaxis específica.
- Compruebe que el tipo especificado en la declaración de interfaz explícita es un tipo de interfaz real (CS0538). Solo se pueden usar tipos de interfaz en sintaxis explícita de implementación de interfaz; Intentar usar una clase u otro tipo que no sea de interfaz infringe las reglas de implementación explícitas.
- Mueva declaraciones de interfaz explícitas a una clase o estructura que declare la interfaz en su lista base (CS0541). Las implementaciones de interfaz explícitas deben aparecer dentro del cuerpo de un tipo de clase o estructura y no se pueden declarar en el nivel de espacio de nombres ni en otros contextos.
Para obtener más información, vea Interfaces, Implementación explícita de interfaz y Cómo implementar eventos de interfaz.
Tipos de retorno y signaturas
Los errores siguientes se producen cuando la firma del método de implementación no coincide con la declaración del miembro de interfaz:
- CS0738: El miembro no implementa el miembro de la interfaz. Es así porque no tiene un tipo de valor de retorno que coincida.
- CS8854: El miembro no implementa el miembro de la interfaz.
- CS9333: El tipo de parámetro debe coincidir con el miembro implementado.
- CS9334: El tipo de valor devuelto debe coincidir con el miembro implementado.
Puede corregir estos errores mediante las técnicas siguientes:
- Cambie el tipo de valor devuelto del método de implementación para que coincida exactamente con el tipo de valor devuelto declarado en el miembro de interfaz (CS0738, CS9334). La firma de la implementación debe coincidir exactamente con la declaración de interfaz porque la firma del método forma parte del contrato que determina qué miembro de interfaz se está implementando.
- Asegúrese de que los tipos de parámetro del método de implementación coincidan exactamente con los tipos de parámetro declarados en el miembro de interfaz (CS9333). Cada parámetro debe tener el tipo idéntico en la misma posición que se especifica en la declaración de interfaz, ya que los tipos de parámetro son componentes fundamentales de la firma de método que el compilador usa para hacer coincidir las implementaciones con los miembros de la interfaz.
- Agregue un
initaccesor a la propiedad de implementación cuando la propiedad de la interfaz declare uninitsetter (CS8854). Lainitpalabra clave permite la inicialización de propiedades durante la construcción del objeto, al tiempo que impide la modificación posterior, y la propiedad de implementación debe proporcionar este mismo comportamiento de solo inicialización para satisfacer el contrato de interfaz.
Para obtener más información, vea Interfaces, propiedades e establecedores de solo inicialización.
Implementaciones que faltan o están incompletas
Los errores siguientes se producen cuando una clase no puede implementar completamente una interfaz o implementa miembros que no coinciden con el contrato de interfaz:
- CS0535: Un miembro no implementa el miembro de la interfaz.
- CS0550: El miembro agrega un método accesor que no está presente en el miembro de la interfaz.
- CS0551: Falta un accesor para la implementación explícita de la interfaz.
Puede corregir estos errores mediante las técnicas siguientes:
- Proporcione una implementación para cada miembro declarado en la interfaz o declare el tipo como
abstract(CS0535). Cada miembro debe implementarse para satisfacer los requisitos de interfaz. - Quite los descriptores de acceso de la propiedad de implementación que no se declaran en la propiedad de interfaz (CS0550). La propiedad de implementación solo puede incluir los descriptores de acceso declarados explícitamente en la definición de interfaz, lo que garantiza que la implementación no agrega funcionalidad más allá de lo que especifica el contrato de interfaz.
- Agregue todos los descriptores de acceso necesarios a la implementación de interfaz explícita para que coincida con la declaración de interfaz (CS0551). Cada descriptor de acceso declarado en la interfaz debe tener un descriptor de acceso correspondiente en la implementación con firmas coincidentes, ya que la implementación debe cumplir el contrato de descriptor de acceso completo definido por la interfaz.
Para obtener más información, vea Interfaces y propiedades.
Emparejamiento y resolución de miembros
Los errores siguientes se producen al intentar implementar miembros de interfaz que no existen en la interfaz o cuando el tipo contenedor no declara la interfaz:
- CS0539: El miembro en la declaración explícita de la interfaz no se encuentra entre los miembros de la interfaz disponible para implementar.
- CS0540: El tipo contenedor no implementa el miembro de interfaz.
Puede corregir estos errores mediante las técnicas siguientes:
- Compruebe que el nombre de miembro y la firma de la implementación de interfaz explícita coincidan exactamente con un miembro declarado en la interfaz o quite la implementación incorrecta (CS0539). El miembro que intenta implementar debe existir realmente en la definición de interfaz con el nombre coincidente, el tipo de valor devuelto y los tipos de parámetros, ya que la implementación explícita de la interfaz requiere una correspondencia precisa con el contrato de interfaz.
- Agregue la interfaz a la lista base de la clase o estructura, o quite la implementación de interfaz explícita (CS0540). Un tipo solo puede implementar explícitamente miembros de interfaces que declara en su lista de herencia, por lo que el tipo de implementación debe establecer la relación de interfaz para poder proporcionar implementaciones explícitas.
Para obtener más información, vea Interfaces e Implementación de interfaz explícita.
Restricciones de tipo genérico
Los errores siguientes se producen al implementar métodos de interfaz genéricos con restricciones de parámetro de tipo:
- CS0425: las restricciones para el parámetro de tipo del método deben coincidir con las restricciones para el parámetro de tipo del método de interfaz. Considere la posibilidad de usar una implementación de interfaz explícita en su lugar.
- CS0460: Las restricciones de los métodos de sobreescritura y de implementación explícita de interfaz se heredan del método base, por lo que no se pueden especificar directamente, excepto por una restricción de tipo 'class' o 'struct'.
Puede corregir estos errores mediante las técnicas siguientes:
- Asegúrese de que la
wherecláusula del método de implementación es idéntica a la declaración del método de interfaz o coincide con el significado semántico de las restricciones (CS0425). Las restricciones de parámetro de tipo de la implementación deben coincidir con las definidas en la interfaz o el método base. - Quite las declaraciones de restricciones explícitas de los métodos de implementación de interfaz sobrescritos y explícitos (CS0460). El método de invalidación hereda automáticamente sus restricciones del método base o de interfaz, por lo que volver a declararlas es redundante y no se permite, excepto para casos específicos permitidos en C# 8 y versiones posteriores.
- Aplique la
defaultrestricción para resolver ambigüedades con tipos de referencia anulables al sobrescribir e implementar interfaces explícitas al usar C# 9 o posterior (CS0460). Esta excepción a la regla de herencia de restricciones permite especificar explícitamente la restricción predeterminada para desambiguar los contextos de anotación que aceptan valores NULL. - Especifique explícitamente
where T : classowhere T : structrestricciones en métodos de implementación de interfaz sobrescritos y explícitos al utilizar C# 8 o posterior para habilitar anotaciones de tipos de referencia anulables (CS0460). Estas restricciones específicas son permitidas para admitir el análisis de tipos de referencia anulables en parámetros de tipo que están restringidos a tipos de referencia o tipos de valor.
Para obtener más información, vea Restricciones en los parámetros de tipo, interfaces y tipos de referencia que aceptan valores NULL.
Visibilidad y modificadores del método
Los errores siguientes se producen al implementar métodos de interfaz con accesibilidad o modificadores incorrectos:
- CS0736: el miembro no implementa el miembro de la interfaz de instancia. No puede implementar el miembro de interfaz porque es estático.
- CS0737: el miembro no implementa el miembro de interfaz. No puede implementar un miembro de interfaz porque no es público.
Puede corregir estos errores mediante las técnicas siguientes:
- Quite el
staticmodificador de la declaración de método que implementa el miembro de interfaz (CS0736). Antes de C# 10, los miembros de interfaz son miembros de instancia, no miembros estáticos. - Agregue el
publicmodificador de acceso al método que implementa el miembro de interfaz (CS0737). Todos los miembros de la interfaz son implícitamentepublicporque las interfaces definen un contrato para el comportamiento público, por lo que el método de implementación también debe tener accesibilidad pública para que sea accesible a través de la referencia de interfaz.
Para obtener más información, vea Interfaces y modificadores de acceso.
Implementación y conflictos de accesores
Los errores siguientes se producen al implementar propiedades o eventos de interfaz con métodos de acceso que tienen problemas de visibilidad o conflictos de nombres.
- CS0277: el miembro no implementa el miembro de interfaz porque no es público.
- CS0470: el método no puede implementar el accesor de interfaz para el tipo. Use una implementación de interfaz explícita.
- CS0686: El descriptor de acceso no puede implementar el miembro de la interfaz. Use una implementación de interfaz explícita.
Puede corregir estos errores mediante las técnicas siguientes:
- Quite los modificadores de acceso de los descriptores de acceso que restrinjan la visibilidad a menos visibles que
public, o agregue elpublicmodificador si falta (CS0277). Todos los miembros de la interfaz son implícitamentepublic, por lo que el descriptor de acceso de implementación también debe tener visibilidad pública para cumplir con el contrato de la interfaz y ser accesible a través del tipo de interfaz. - Reemplace los nombres de métodos similares a descriptores de acceso (como
get_PropertyName) empleando la sintaxis correcta para propiedades mediante el uso de implementación explícita de interfaces (CS0470). El compilador genera métodos de acceso internamente para las propiedades, y el intento de crear manualmente métodos con estos nombres reservados genera conflictos con el mecanismo de implementación de propiedades. - Use la sintaxis de implementación de interfaz explícita para resolver conflictos de nomenclatura cuando la interfaz contiene nombres de método que coinciden con los métodos de descriptor de acceso generados automáticamente (CS0686). El compilador genera automáticamente métodos como
get_Propertyyset_Propertypara propiedades yadd_Eventremove_Eventpara eventos, por lo que si una interfaz declara métodos con estos nombres exactos, se requiere una implementación explícita para desambiguar entre el método de interfaz y el descriptor de acceso generado por el compilador.
Para obtener más información, vea Interfaces, propiedades y eventos.
Implementaciones ambiguas y conflictivas
Los errores siguientes se producen cuando el compilador no puede determinar qué implementación de interfaz se va a usar:
- CS0473: la implementación explícita de la interfaz "nombre del método" coincide con más de un miembro de interfaz. Qué miembro de interfaz se elige realmente depende de la implementación. Considere la posibilidad de usar una implementación no explícita en su lugar.
- CS8705: el miembro de interfaz 'member' no tiene una implementación más específica. Tampoco es más específico.
Puede corregir estos errores mediante las técnicas siguientes:
- Elimine la implementación explícita de la interfaz y, en su lugar, use una única implementación pública implícita para ambos métodos de interfaz (CS0473). Cuando un método genérico adquiere la misma firma que un método no genérico (por ejemplo, al implementar
ITest<int>dónde yTestMethod(int)TestMethod(T)se vuelven idénticos), el sistema de metadatos de la infraestructura de lenguaje común no puede determinar de forma inequívoca qué miembro de interfaz enlaza a qué ranura de implementación, por lo que el uso de la implementación implícita permite que el método único cumpla ambos requisitos de interfaz. - Proporcione una implementación explícita en la clase o estructura de implementación que resuelva la ambigüedad entre varias implementaciones predeterminadas (CS8705). Este error suele producirse con patrones de herencia de diamantes en los que una clase implementa varias interfaces que proporcionan implementaciones predeterminadas para el mismo miembro. El compilador necesita especificar explícitamente qué implementación se va a usar o proporcionar su propia implementación.
- Reestructure la jerarquía de interfaz para evitar conflictos de herencia de diamantes en los que varias interfaces proporcionan implementaciones predeterminadas para el mismo miembro (CS8705). Al rediseñar las relaciones de interfaz o consolidar las implementaciones predeterminadas en una sola interfaz, puede eliminar la ambigüedad que impide que el compilador determine la implementación más específica.
Para obtener más información, vea Interfaces y métodos de interfaz predeterminados.
Restricciones de implementación especiales
El siguiente error se produce cuando se usan tipos de parámetros especiales que no son compatibles con la implementación de la interfaz:
- CS0630: el miembro no puede implementar un miembro de interfaz porque tiene un parámetro __arglist.
Puede corregir este error mediante las técnicas siguientes:
- Quite el
__arglistparámetro del método de implementación (CS0630). La__arglistpalabra clave permite a los métodos aceptar números variables de argumentos de forma no administrada, pero esta característica no es compatible con la implementación de la interfaz porque los contratos de interfaz requieren firmas predecibles y seguras para tipos que se pueden comprobar en tiempo de compilación. - Reemplace el
__arglistparámetro por unparamsparámetro de matriz para las listas de argumentos de longitud variable (CS0630). A diferencia de__arglist, la palabra claveparamsproporciona un mecanismo seguro de tipos para aceptar una cantidad variable de argumentos que es totalmente compatible con la implementación de la interfaz y mantiene la seguridad del tipo en tiempo de compilación que requieren las interfaces.
Para obtener más información, vea Interfaces y palabra clave params.