¿Puedo tener un tipo que a la vez, covariante y contravariante, es decir, totalmente fungibles / cambiante con sub y súper tipos?

StackOverflow https://stackoverflow.com/questions/2809932

Pregunta

¿Puedo tener un tipo (por ahora olvidar su semántica) que puede ser covariante, así como contravariant?

por ejemplo:

public interface Foo<in out T>
{
    void DoFooWith(T arg);
}

Off para el blog de Eric Lippert para la carne y las patatas de la varianza en C # 4.0, ya que es poco más que en cualquier parte cubiertas de tierra adecuada sobre el tema.


Me lo intentó de todas formas, no sólo no permite eso, pero me dice que me falta el punto. Necesito entender el vínculo entre sólo lectura, sólo escritura y la varianza.

Creo que hay otros que leer.

Sin embargo, cualquier cortos, Reyes inducir respuestas son bienvenidos, por su parte.

¿Fue útil?

Solución

No, usted no puede hacer eso.

Supongamos que eran legales. A tomar una IFoo<Giraffe>. Desde IFoo es covariante en T, se puede convertir a través de la conversión typesafe referencia a IFoo<object>. Dado que es contravariante, puede convertir a que IFoo<Banana>. Lo que sea posible la semántica están ahí para IFoo<T> de tal manera que tiene sentido de ser capaz de convertir un IFoo de jirafas a una IFoo de bananos a través de la conversión de referencia? Jirafas y plátanos tienen nada en común, aparte de ser los tipos de referencia. No es posible tener un método de IFoo<Banana> que devuelve un plátano, ya que en realidad podría ser una implementación de IFoo<Giraffe>; ¿Cómo sería el autor de la ejecución saber para entregar un plátano? No es posible tener un método de IFoo<Banana> que toma un plátano por la misma razón; el implementador de IFoo<Giraffe> está esperando a que le entregue una jirafa.

Aquí hay otra manera de ver las cosas:

  • "en T" significa (más o menos) "T aparece sólo en posiciones de entrada".
  • "fuera T" significa (más o menos) "T aparece sólo en posiciones de salida".

Por lo tanto "en el cabo T" significaría ... ¿qué? Como ya hemos visto, sólo puede significar "T no aparece en absoluto en cualquier método o propiedad." ¿Cuál es el punto de hacer un tipo genérico en T donde nunca utiliza T?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top