¿Puedo tener un tipo (por ahora olvidando su semántica) que puede ser covariante y también contravariante?¿Puedo tener un tipo que sea ambos, covariante y contravariante, es decir, completamente fungible/modificable con sub y super tipos?
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 como hay poco más en cualquier lugar que cubre de tierra adecuada sobre el tema.
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 solo lectura, solo escritura y varianza.
Supongo que tengo que leer un poco más.
Pero cualquier respuesta breve, epifanía inductora es bienvenida, mientras tanto.
En realidad, los tipos genéricos que no utilizan sus argumentos de tipo genérico pueden ser extremadamente útiles. Los llamados "tipos fantasma" permiten que el código se escriba de tal manera que las operaciones incorrectas se pueden rechazar estáticamente. El ejemplo canónico es probablemente el tipo 'Archivo', donde el tipo 'T' codifica si el archivo permite leer, escribir o ambos aunque las partes internas de la clase nunca hagan referencia a 'T'. –
kvb
Por supuesto, podría violar fácilmente el beneficio de seguridad de los tipos fantasmas si el tipo se anotara tanto como covariante como contravariante, ya que podría convertir un 'Archivo' en un 'Archivo ', como puede observar. –
kvb
@kvb: ¿Cómo es eso diferente de simplemente hacer una clase base Archivo y clases derivadas "WritableFile", "LecturaFile" y "ReadableAndWritableFile"? ¿Por qué capturar algo en el sistema de tipo genérico cuando simplemente podría capturarse en el sistema de tipo ordinario? –