Por qué la covarianza está prohibida para la clase abstracta en C #

7

He estado cavando en la covarianza y contravarianza en C # y hay una cosa que no pude entender. C # (AFAIK, a partir de la versión 4) permite declarar las interfaces covariantes o contravariantes y los delegados mediante las palabras clave out y in . Sin embargo, la declaración de la clase abstracta con tales palabras clave no es posible. ¿Alguien podría compartir una idea sobre por qué se hizo así? Entiendo los problemas generales y los problemas de covarianza y contravarianza, LSP, etc. Sin embargo, no pude dar una idea de por qué la clase abstracta no es semánticamente adecuada para ser covariante o contravariante, mientras que la interfaz sí lo es.

Aquí hay una muestra de la clase abstracta solo para completar. No se compilará.

public abstract class SomeList<out T> where T : class
{

}
    
pregunta Vlad Stryapko 12.02.2016 - 12:06

1 respuesta

2

La covarianza y la contravarianza no están permitidas en ninguna clase. Como las clases abstractas pueden tener una implementación concreta, esto también se aplica a ellas. Las respuestas cortas de por qué es que (a) el CLR no lo admite y (b) no lo admite, porque (para la covarianza):

  

[una clase C<T> ] no puede tener ningún método que tome un T , ninguna propiedad de tipo T con un definidor, o cualquier campo de tipo T , porque los campos son lógicamente lo mismo que los definidores de propiedades ; T va en [solo]

y por lo tanto la clase tendría que ser completamente inmutable. Del mismo modo, una clase contravariante no podría permitir un método que devuelva T o una propiedad de tipo T con un captador, es decir, los datos no se podrían obtener de ella. Esto limita la utilidad de permitirlo (en lugar de permitirlo solo en interfaces) para que no valga la pena el esfuerzo de hacer que CLR apoye esta idea.

Please vea esta respuesta a otra pregunta de Eric Lippert para obtener más detalles (la cita anterior es de esa respuesta).

    
respondido por el David Arno 12.02.2016 - 14:19

Lea otras preguntas en las etiquetas