Compartir a través de


Errores y advertencias de miembro de interfaz virtual y abstracto estático

El compilador genera los siguientes errores para declaraciones no válidas de miembros virtuales o abstractos 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 el operador ++ o -- debe ser el tipo contenedor o su parámetro de tipo restringido a él.
  • CS8923: el tipo de valor devuelto para el operador ++ o -- debe coincidir con el tipo de parámetro, o bien debe derivarse del tipo de parámetro, o ser el parámetro de tipo del tipo 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 su parámetro de tipo restringido
  • CS8926: solo se puede tener acceso a un miembro de interfaz abstracto o virtual estático en un parámetro de tipo.
  • CS8928: el tipo no implementa el miembro de interfaz estático. 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 se debe declarar como estático
  • CS8931: la conversión definida por el usuario en una interfaz debe convertir hacia o desde un parámetro de tipo en el tipo envolvente restringido al tipo envolvente
  • CS8932: el método "UnmanagedCallersOnly" no puede implementar el miembro de interfaz en el tipo

Estos errores se producen en tres lugares del código:

Errores en la declaración de interfaz

Es posible que se produzcan los errores siguientes 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.
  • CS8922: el tipo de parámetro para el operador ++ o -- debe ser el tipo contenedor o su parámetro de tipo restringido a él.
  • CS8923: el tipo de valor devuelto para el operador ++ o -- debe coincidir con el tipo de parámetro, o bien debe derivarse del tipo de parámetro, o ser el parámetro de tipo del tipo 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 su parámetro de tipo restringido
  • CS8931: la conversión definida por el usuario en una interfaz debe convertir hacia o desde un parámetro de tipo en el tipo envolvente restringido al tipo envolvente

Todas estas reglas son extensiones de las reglas para declarar operadores sobrecargados. La distinción es que el parámetro puede ser el tipo de interfaz o el parámetro de tipo de la interfaz si ese parámetro de tipo está restringido para implementar la interfaz para su tipo. En el caso de los operadores binarios, solo un parámetro debe cumplir esta regla.

Por ejemplo, INumber<T> puede declarar un T operator++(T) porque T está restringido para implementar INumber<T>.

Para corregir estos errores, asegúrese de que los parámetros de cualquier operador definido en la interfaz cumplan estas reglas. Puede obtener más información en el artículo de referencia del lenguaje sobre miembros abstractos estáticos en interfaces o en el tutorial para explorar miembros de interfaz abstractos estáticos.

Errores en la declaración de interfaz de implementación de tipos

Los errores siguientes pueden producirse al definir un tipo que implementa una interfaz con métodos static abstract o static virtual:

  • CS8928: el tipo no implementa el miembro de interfaz estático. 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 se debe declarar como estático
  • CS8932: el método "UnmanagedCallersOnly" no puede implementar el miembro de interfaz en el tipo

Estos errores indican que ha declarado el método que implementa un miembro de interfaz abstracto estático incorrectamente. Estos miembros deben declararse static; no pueden ser miembros de instancia. Los métodos que implementan miembros de interfaz no pueden tener aplicado el atributo System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute.

Errores al llamar a miembros de la interfaz abstractos estáticos

Los errores siguientes pueden producirse al intentar llamar a un miembro definido como miembro 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 de interfaz abstracto o virtual estático en un parámetro de tipo.

Las llamadas a miembros de interfaz declarados como static abstract o static virtual deben resolverse en tiempo de compilación. Deben resolverse en un miembro estático definido en un tipo que implemente esa interfaz. Esto significa que debe tener acceso a esos miembros mediante un tipo concreto que implemente la interfaz o un parámetro de tipo restringido para implementar la interfaz. Para corregir estos errores, cambie el tipo usado para acceder al miembro estático.