2012-08-13 21 views
6

Dokładny kod próbuję zbudować:Dlaczego ta wariancja jest nieważna?

public interface IMapContainer<out T> where T : MapRoomBase 
    { 
     String GetName(); 

     IEnumerable<T> GetRooms(); 
    } 

dostaję ten błąd: Nieprawidłowy wariancji: Parametr typu „T” musi być ważna w niezmienniczo „MapLibrary.IMapContainer.GetRooms()”. "T" jest kowariantny.

Byłem pod wrażeniem, że będzie to ważne, ponieważ IEnumerable prostu zwraca elementy, i nikt nie może być dodany. Dlaczego to nie jest bezpieczne + ważne?

+0

Przykro mi, ale dlaczego 'out T'? Czy potrzebujesz tego "out"? –

+0

Dlaczego jest T out parametr z interfejsu? Co próbujesz osiągnąć? z mojej perspektywy, która wygląda dziwnie/źle. –

+1

@Xtian, Andre, http://msdn.microsoft.com/en-us/library/dd997386.aspx. –

Odpowiedz

7

Upewnij się, że nie kierujesz reklamy na starą wersję ramową. IEnumerable<T> jest kowariantem zaczynającym się od .NET 4. Twój kod kompiluje się dobrze w .NET 4 i kończy się niepowodzeniem z błędem, o którym wspomniałeś w .NET 3.5.

+0

Właściwie celuję w ramy Silverlight 4 tutaj .. – Erix

+0

Wygląda na to, że kowariancja nie jest obsługiwana w IEnumerable w SL 4. Twoja odpowiedź pomogła mi znaleźć, chociaż nie rozumiem, dlaczego tak jest ... http: // forums.silverlight.net/t/184882.aspx/1 – Erix

+3

Kowariancja jest obsługiwana w SL4 tylko typy BCL, takie jak IEnumerable jest tylko wykonane Covariant w SL5 zobacz to [odpowiedź SO] (http://stackoverflow.com/a/2558592/872395) – nemesv

Powiązane problemy