2010-08-04 10 views
11

Czy jest to ograniczenie CLR, czy też istnieją problemy z kompatybilnością z istniejącym kodem?Dlaczego kowariancja/kontrawariancja C# 4.0 jest ograniczona do sparametryzowanego interfejsu i typów delegowanych?

Czy jest to związane z pomieszaną wariancją połączenia delegatów w C# 4.0?

Edycja: Czy możliwe byłoby posiadanie języka używającego ko-/contravariance bez tego ograniczenia działającego na CLR?

+6

W jaki sposób wariancja uczestnika C# jest "pomieszana"? – thecoop

+0

@thecoop: http://stackoverflow.com/questions/2306814 – soc

+2

Zauważ, że komentarz Eric mówi, że delegat * łączenie * jest pomieszany w odniesieniu do wariancji - a nie generycznych delegatów w ogóle. –

Odpowiedz

5

Prosta odpowiedź: to ograniczenie CLR.

(Nie widać dobry, konkretny wyjaśnieniem tego nigdzie ... Nie pamiętam, widząc jeden w blogu serii Erica o nim, chociaż mogą również zostały pominięte go gdzieś.)

Jedną rzeczą, którą byłoby powiedzieć, że zarówno delegatów i interfejsów już tworzą "warstwy pośrednie" nad prawdziwymi typami; poglądy na temat metod lub klas, jeśli chcesz. Zmiana z jednego widoku na inny jest dość rozsądna. Rzeczywista klasa wydaje mi się bardziej konkretną reprezentacją - a przejście od jednej konkretnej reprezentacji do drugiej wydaje się mniej uzasadnione. Jest to bardzo delikatne wyjaśnienie, a nie prawdziwe techniczne ograniczenie.

+0

To brzmi dość źle. Microsoft w zasadzie powtarza błąd, który Sun zrobił z Generics? Czy planowane jest zniesienie tych ograniczeń w przyszłej aktualizacji CLR? – soc

+0

Implementacja nie jest "pomyłką" - była to wyraźna decyzja projektowa, o której myśleli i mają powody, by ją wdrażać w taki sam sposób. – thecoop

+0

@soc: It's * nothing * like Sun's errors with generics. Nieważne, czy pozwolą na to w przyszłym wydaniu, to nikt się nie domyśla. –

8

Będziesz chciał przeczytać post Eric Lipperta na temat tego, dlaczego działa tak jak on. Krótko mówiąc, dopuszczają tak dużą wariancję, jak to tylko możliwe, nie pozwalając programistom popełniać błędów w programowaniu, które mogą powodować trudności w wykryciu błędów. Wielkość wariancji w 4.0 jest znacznie rozszerzona w stosunku do reguł 3.0, a z tego co rozumiem, wynika, że ​​była to równowaga między tym, co jest korzystne dla programisty, a tym, co jest bezpieczne, aby pozwolić, nie powodując zbyt dużego bólu głowy poprzez niezamierzone błędy.

http://blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance/default.aspx

+0

Chociaż mogę zrozumieć obawy o użyteczność, Java miała to na wieki z bardzo małymi problemami. Mogę sobie wyobrazić, że te ograniczenia stwarzają bardziej złożone, problematyczne rozwiązania, niż to upraszcza. – soc

+3

Generics Java i .NET są implementowane na zupełnie różne sposoby - Java jest czasem kompilacji, .NET jest środowiskiem wykonawczym. Dodanie funkcji (wariancja klasy) zawsze powoduje więcej pracy i więcej problemów do rozważenia niż w inny sposób. – thecoop

+0

@thecoop: Mówiłeś o punkcie widzenia programistów w swojej odpowiedzi, a nie o technicznych trudnościach po stronie implementacji. Tak więc szczegóły implementacji implementacji wariancji w JVM/CLR nie są tak naprawdę problemem programisty. – soc

Powiązane problemy