2011-07-19 11 views
9

El CLR no es compatible con covariant return types o full variance (es decir, se aplica a las clases, no solo a las interfaces y delegados), pero hay idiomas que se orientan al CLR que utilizan una o ambas características.¿Cómo funcionan los lenguajes Scala que necesitan tipos de retorno covariantes y varianza de clase "real" en el CLR?

¿Hay alguna solución práctica para que el CLR habilite esta funcionalidad o estos lenguajes emplean algún tipo de técnica de reescritura/borrado/... para soportar completamente su conjunto de características?

+0

Se equivoca cuando dice que C++/CLI permite tipos de retorno covariantes. Consulte [Error del compilador C2392] (http://msdn.microsoft.com/en-us/library/1z1xy8y4.aspx) –

+0

Ok, corregido. ¡Gracias! (¿Conoce otro idioma con tipos de retorno covariantes?) – soc

+0

@soc: Native C++ sí los admite. Sin embargo, eso no es muy relevante ni útil. – Puppy

Respuesta

13

Probablemente de la misma manera que Java lo hace (Java 5 admite retornos covariantes en el nivel de idioma, pero la JVM no lo admite): mediante la adición de métodos sintéticos. Así es como Java lo hace: supongamos que tiene una clase como esta:

class Foo implements Cloneable { 
    @Override 
    public Foo clone() { 
     // ... 
    } 
} 

Detrás de las escenas, dosclone métodos consiguen generados: public Foo clone() (que contiene el código real), y public Object clone() (que simplemente devuelve el resultado del primero). El último método (que se sintetiza) es cómo el método clone se reemplaza en el nivel JVM.

+0

Parece probable ... Me pregunto por qué no usaron eso en C# para admitir esa función (si es tan fácil como suena) ... – soc

+3

@soc: Simplemente porque el comité C# no quiere para cambiar las especificaciones al respecto. – paradigmatic

+0

¿Por qué necesita incluso materiales sintéticos para esto? Me imagino que un compilador podría lanzar un elenco implícito; toda la información necesaria para hacer esto está disponible en tiempo de compilación. –

Cuestiones relacionadas