2012-08-13 16 views
6

codice esatto sto cercando di costruire:Perché si tratta di una varianza non valida?

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

     IEnumerable<T> GetRooms(); 
    } 

sto ottenendo questo errore: varianza non valido: Il parametro di tipo 'T' deve essere invariantly valido 'MapLibrary.IMapContainer.GetRooms()'. 'T' è covariante.

Ho avuto l'impressione che ciò sarebbe valido poiché IEnumerable restituisce semplicemente gli elementi e nessuno può essere aggiunto. Perché questo non è sicuro + valido?

+0

Mi dispiace, ma perché 'out T'? Ti serve questo? –

+0

Perché T è un parametro out dalla tua interfaccia ?? Cosa stai cercando di ottenere? dal mio punto di vista che sembra strano/sbagliato. –

+1

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

risposta

7

Assicurati di non utilizzare come target una vecchia versione di framework. IEnumerable<T> è covariant che inizia con .NET 4. Il tuo codice si compila bene con .NET 4 e fallisce con l'errore che hai citato su .NET 3.5.

+0

In questo caso sto prendendo di mira il framework Silverlight 4. – Erix

+0

Sembra che la covarianza non sia supportata in IEnumerable in SL 4. La tua risposta mi ha aiutato a trovarlo, anche se non capisco perché questo ... http: // forums.silverlight.net/t/184882.aspx/1 – Erix

+3

Covariance è supportato in SL4 solo i tipi BCL come IEnumerable sono realizzati solo in Covariant in SL5 vedi questa [risposta SO] (http://stackoverflow.com/a/2558592/872.395) – nemesv

Problemi correlati