2011-07-19 8 views
9

Środowisko CLR nie obsługuje covariant return types ani full variance (i. E. Dotyczy klas, nie tylko interfejsów i delegatów), ale są języki docelowe dla CLR, które korzystają z jednej lub obu tych funkcji.W jaki sposób języki Scala, które wymagają typów zmiennych kowariancyjnych i "prawdziwej" wariancji klasy, działają na CLR?

Czy istnieje pewne praktyczne obejście tego środowiska CLR w celu włączenia tej funkcji lub czy w tych językach stosuje się technikę przepisywania/usuwania/... w celu pełnego wsparcia zestawu funkcji?

+0

Mylisz się, kiedy mówisz, że C++/CLI zezwala na typ kowariancyjny. Zobacz [Błąd kompilatora C2392] (http://msdn.microsoft.com/en-us/library/1z1xy8y4.aspx) –

+0

OK, naprawiono. Dzięki! (Czy znasz inny język z kowariantnymi typami zwracania?) – soc

+0

@soc: Natywny C++ je obsługuje. Oczekuję jednak, że nie jest to zbyt trafne i pomocne. – Puppy

Odpowiedz

13

Prawdopodobnie w ten sam sposób, w jaki robi to Java (Java 5 obsługuje kowariantne zwroty na poziomie języka, ale JVM jej nie obsługuje): dodając metody syntetyczne. Oto jak Java prawda: że masz klasę tak:

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

za kulisami, dwaclone metody generowana: public Foo clone() (który zawiera prawdziwy kod) i public Object clone() (które po prostu zwraca wynik Poprzedniego). Ta druga metoda (która jest syntetyzowana) polega na tym, że metoda clone zostaje nadpisana na poziomie JVM.

+0

To brzmi prawdopodobnie ... Po prostu zastanawiam się, dlaczego nie użyli tego w C# do obsługi tej funkcji (jeśli jest to tak proste, jak się wydaje) ... – soc

+3

@soc: Po prostu dlatego, że komitet C# nie chce aby zmienić specyfikacje na ten temat. – paradigmatic

+0

Dlaczego potrzebujesz do tego syntetyków? Wyobrażam sobie, że kompilator może zamiast tego rzucać się w niejawny rzut; wszystkie informacje potrzebne do tego są dostępne w czasie kompilacji. –