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 genera los siguientes errores para declaraciones no válidas de miembros abstractos o virtuales estáticos en interfaces:
- CS8920: la interfaz no se puede usar como argumento de tipo. El miembro estático no tiene una implementación más específica en la interfaz.
- CS8921: el parámetro de un operador unario debe ser el tipo contenedor o su parámetro de tipo restringido a él.
-
CS8922: El tipo de parámetro para
++o--debe ser el tipo contenedor o un parámetro de tipo restringido a este. -
CS8923: El tipo de valor de retorno del operador
++o--debe coincidir con el tipo de parámetro, derivarse de él, o ser el parámetro de tipo del contenedor restringido a él, a menos que el tipo de parámetro sea un parámetro de tipo diferente. - CS8924: uno de los parámetros de un operador binario debe ser el tipo contenedor o su parámetro de tipo restringido a él.
- CS8925: El primer operando de un operador de desplazamiento sobrecargado debe tener el mismo tipo que el tipo contenedor o un parámetro de tipo que esté restringido a él.
- CS8926: solo se puede tener acceso a un miembro estático de interfaz virtual o abstracta en un parámetro de tipo.
- CS8928: el tipo no implementa el miembro de interfaz estática. El método no puede implementar el miembro de interfaz porque no es estático.
- CS8930: La implementación explícita de un operador definido por el usuario debe declararse estática.
- CS8931: La conversión definida por el usuario en una interfaz debe convertir en o desde un parámetro de tipo en el tipo envolvente restringido al tipo envolvente.
- CS8932: el método 'UnmanagedCallersOnly' no puede ser utilizado para implementar un miembro de interfaz en un tipo
- CS9044: El tipo no implementa el miembro de interfaz. El método no puede implementar implícitamente un miembro inaccesible.
- CS9046: uno de los parámetros de un operador de igualdad o desigualdad declarado en una interfaz debe ser un parámetro de tipo restringido a la interfaz.
Estos errores se producen en tres lugares del código:
- Al declarar una interfaz con miembros abstractos o virtuales estáticos,
- Al declarar un tipo que implementa una interfaz con miembros abstractos o virtuales estáticos, y
- Cuando se accede a un método abstracto o virtual estático declarado en una interfaz.
Errores en la declaración de interfaz
Es posible que encuentre los siguientes errores al declarar una interfaz con miembros static abstract o static virtual:
- CS8921: el parámetro de un operador unario debe ser el tipo contenedor o su parámetro de tipo restringido a él.
- El tipo de parámetro para el operador o
++debe ser el tipo que lo contiene o un parámetro de tipo que esté restringido a este. -
CS8923: El tipo de retorno para el operador
++o--debe coincidir con el tipo de parámetro, derivarse de él, o ser un parámetro de tipo del contenedor restringido a este, a menos que el tipo de parámetro sea un parámetro de tipo diferente. - CS8924: uno de los parámetros de un operador binario debe ser el tipo contenedor o su parámetro de tipo restringido a él.
- CS8925: El primer operando de un operador de desplazamiento sobrecargado debe tener el mismo tipo que el tipo contenedor o estar restringido a un parámetro de tipo de este.
- CS8931: La conversión definida por el usuario en una interfaz debe convertir en o desde un parámetro de tipo en el tipo envolvente restringido al tipo envolvente.
- CS9046: uno de los parámetros de un operador de igualdad o desigualdad declarado en la interfaz debe ser un parámetro de tipo restringido a la interfaz.
En el caso de los operadores unarios declarados en una interfaz, asegúrese de que el parámetro es el propio tipo de interfaz o un parámetro T de tipo donde T está restringido para implementar la interfaz (CS8921). Esta restricción garantiza que el operador solo se puede aplicar a los tipos que implementan la interfaz, lo que permite al compilador resolver la implementación correcta en tiempo de compilación.
Para los operadores de incremento (++) y decremento (--), compruebe que el parámetro sigue las mismas reglas que otros operadores unarios (CS8922). Además, el tipo de valor devuelto debe coincidir con el tipo de parámetro, derivar de él o ser el parámetro de tipo de la interfaz restringido a la interfaz (CS8923). Estas reglas garantizan que las operaciones de incremento y decremento devuelvan un tipo compatible que se pueda volver a asignar a la variable original.
Para los operadores binarios, al menos uno de los dos parámetros debe ser el tipo de interfaz contenedor o un parámetro de tipo restringido para implementar la interfaz (CS8924). Este requisito permite que el otro parámetro sea de cualquier tipo, habilitando operadores como T operator +(T left, int right) en escenarios matemáticos genéricos.
Para los operadores de desplazamiento (<< y >>), el primer operando debe ser el tipo contenedor o su parámetro de tipo restringido (CS8925). El segundo operando sigue las reglas del operador de desplazamiento estándar y normalmente es int.
Para los operadores de conversión definidos por el usuario, la conversión debe implicar un parámetro de tipo restringido al tipo de interfaz envolvente (CS8931). No se pueden definir conversiones entre tipos arbitrarios en una interfaz; la conversión debe relacionarse con los tipos que implementan la interfaz.
Para los operadores de igualdad (==) y desigualdad (!=), al menos un parámetro debe ser un parámetro de tipo restringido a la interfaz, no solo el propio tipo de interfaz (CS9046). Este requisito más estricto para los operadores de igualdad garantiza una adecuada seguridad de tipos al comparar instancias mediante la interfaz.
Para obtener más información sobre las reglas para las declaraciones de operador en interfaces, vea miembros abstractos estáticos en interfaces. Para obtener una guía práctica sobre la implementación de estos patrones, consulte Exploración de miembros estáticos de interfaz abstracta.
Errores en la declaración de interfaz de implementación de tipos
Es posible que encuentre los siguientes errores al definir un tipo que implemente una interfaz con static abstract métodos o static virtual :
- CS8928: el tipo no implementa el miembro de interfaz estática. El método no puede implementar el miembro de interfaz porque no es estático.
- CS8930: La implementación explícita de un operador definido por el usuario debe declararse estática.
- CS8932: el método 'UnmanagedCallersOnly' no puede implementar un miembro de interfaz de un tipo
- CS9044: El tipo no implementa el miembro de interfaz. El método no puede implementar implícitamente un miembro inaccesible.
Al implementar un miembro estático de interfaz virtual abstracta o estática, declare el método de implementación mediante el static modificador (CS8928). A diferencia de los miembros de la interfaz de instancia implementados por métodos de instancia, los miembros abstractos estáticos requieren implementaciones estáticas porque el tiempo de ejecución los invoca en el propio tipo, no en una instancia.
Para implementaciones explícitas de operadores definidos por el usuario desde una interfaz, incluya el static modificador en la implementación (CS8930). Las implementaciones de interfaz explícitas de los operadores siguen el mismo requisito estático que las implementaciones implícitas.
Quite el System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute atributo de cualquier método que implemente un miembro de interfaz (CS8932). Los métodos marcados con este atributo solo se pueden llamar desde código no administrado y no pueden participar en la implementación de la interfaz porque el tiempo de ejecución debe llamarlos a través del mecanismo de distribución de la interfaz.
Si el método de implementación tiene una accesibilidad más restrictiva que el miembro de interfaz (por ejemplo, un private método o internal que implementa un public miembro de interfaz), use la sintaxis de implementación de interfaz explícita en lugar de la implementación implícita (CS9044). La implementación implícita requiere que el miembro de implementación sea al menos tan accesible como el miembro de interfaz que implementa.
Para obtener más información sobre la implementación de miembros de interfaz, vea Interfaces y implementación de interfaz explícita.
Errores al llamar a miembros de la interfaz abstracta estática
Es posible que vea los siguientes errores al intentar llamar a un miembro definido como static abstract o static virtual de una interfaz:
- CS8920: la interfaz no se puede usar como argumento de tipo. El miembro estático no tiene una implementación más específica en la interfaz.
- CS8926: solo se puede tener acceso a un miembro estático de interfaz virtual o abstracta en un parámetro de tipo.
Cuando se usa una interfaz con miembros abstractos estáticos como argumento de tipo, asegúrese de que todos los miembros abstractos estáticos tengan disponible una implementación más específica (CS8920). Este error aparece cuando el compilador no puede determinar qué implementación se va a usar, normalmente porque varias jerarquías de interfaz proporcionan implementaciones predeterminadas en conflicto o ninguna implementación existe.
Acceda a miembros estáticos de interfaz virtual abstracta o estática a través de un parámetro de tipo restringido para implementar la interfaz, en lugar de a través del tipo de interfaz directamente (CS8926). Por ejemplo, use T.MemberName donde T está restringido por where T : IMyInterface, en lugar de IMyInterface.MemberName. El compilador necesita un tipo concreto para resolver qué implementación llamar y un parámetro de tipo restringido proporciona ese tipo concreto en tiempo de compilación a través de la especialización genérica.
Para obtener más información sobre el acceso a miembros abstractos estáticos, vea miembros abstractos estáticos en interfaces.