2012-08-13 17 views
6

Genauer Code versuche ich zu bauen:Warum ist das eine ungültige Varianz?

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

     IEnumerable<T> GetRooms(); 
    } 

Ich erhalte diese Fehlermeldung: Ungültige Varianz: Der Typ-Parameter ‚T‘ muss invariant gültig auf ‚MapLibrary.IMapContainer.GetRooms()‘ sein. "T" ist kovariant.

Ich hatte den Eindruck, dass dies gültig wäre, da IEnumerable einfach die Elemente zurückgibt und keine hinzugefügt werden können. Warum ist das nicht sicher + gültig?

+0

Es tut mir leid, aber warum 'out T'? Brauchst du das "out"? –

+0

Warum ist T ein out Parameter von Ihrem Interface? Was versuchst du zu erreichen? Aus meiner Sicht sieht das komisch/falsch aus. –

+1

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

Antwort

7

Stellen Sie sicher, dass Sie nicht auf eine alte Framework-Version abzielen. IEnumerable<T> ist Kovariante beginnend mit .NET 4. Ihr Code kompiliert unter .NET 4 gut und schlägt mit dem Fehler fehl, den Sie in .NET 3.5 erwähnen.

+0

Ich ziele eigentlich auf das Silverlight 4 Framework hier .. – Erix

+0

Es scheint, dass Kovarianz in IEnumerable in SL 4 nicht unterstützt wird. Ihre Antwort hat mir geholfen, das zu finden, obwohl ich nicht verstehe, warum das ist ... http: // forens.silverlight.net/t/184882.aspx/1 – Erix

+3

Covariance wird in SL4 unterstützt nur die BCL Typen wie IEnumerable ist nur in SL5 Covariant gemacht sehen Sie dies [SO Antwort] (http://stackoverflow.com/a/2558592/872395) – nemesv