2012-08-13 21 views
6

código exacto que estoy tratando de construir:¿Por qué es esta una variación inválida?

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

     IEnumerable<T> GetRooms(); 
    } 

que estoy recibiendo este error: varianza no válido: El parámetro de tipo 'T' debe ser válida en invariantly 'MapLibrary.IMapContainer.GetRooms()'. 'T' es covariante.

Tenía la impresión de que esto sería válido ya que IEnumerable simplemente devuelve los elementos y no se puede agregar ninguno. ¿Por qué esto no es seguro + válido?

+0

Lo siento, pero ¿por qué 'out T'? ¿Lo necesitas 'out'? –

+0

¿Por qué T es un parámetro de salida de su interfaz? ¿Qué estás intentando lograr? desde mi punto de vista que se ve extraño/incorrecto. –

+1

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

Respuesta

7

Asegúrate de no estar orientando a una versión de marco anterior. IEnumerable<T> es covariante comenzando con .NET 4. Su código compila bien bajo .NET 4 y falla con el error que menciona en .NET 3.5.

+0

En realidad me estoy dirigiendo al marco de Silverlight 4 aquí .. – Erix

+0

Parece que la covarianza no es compatible con IEnumerable en SL 4. Su respuesta me ayudó a encontrarlo, aunque no entiendo por qué esto es ... http: // forums.silverlight.net/t/184882.aspx/1 – Erix

+3

Covarianza es compatible con SL4 solo los tipos de BCL como IEnumerable solo se hacen Covariante en SL5 ver esto [SO answer] (http://stackoverflow.com/a/2558592/872395) – nemesv