2012-08-13 25 views
6

Tam kod ı kurmaya çalışıyorum:Bu neden geçersiz bir varyans?

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

     IEnumerable<T> GetRooms(); 
    } 

bu hatayı alıyorum: Geçersiz varyans: tür parametresi 'T' 'MapLibrary.IMapContainer.GetRooms()' üzerine değişmez olarak geçerli olmalıdır. 'T' kovaryanttır.

IEnumerable'ın öğeleri döndürdüğünden ve bunun eklenemeyeceğinden, bunun geçerli olacağını düşündüğüm izlenim altındaydım. Bu neden güvenli değil + geçerli?

+0

Üzgünüm, ama neden T '? Buna ihtiyacın var mı? –

+0

Niçin Arayüzünüzden bir çıkış parametresi var? Neyi başarmaya çalışıyorsun? Benim bakış açımdan tuhaf/yanlış görünüyor. –

+1

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

cevap

7

Eski bir çerçeve sürümünü hedeflemediğinizden emin olun. IEnumerable<T>, .NET 4 ile başlayan covariant'tır. Sizin kodunuz .NET 4 altında iyi derler ve .NET 3.5'den bahsettiğiniz hatayla başarısız olur.

+0

Aslında Silverlight 4 çerçevesini burada hedefliyorum. – Erix

+0

Öyle görünüyor ki SL 4'te IEnumerable'da covariance desteklenmiyor gibi görünüyor. Cevabınız, bunun neden olduğunu anlamamama rağmen bana yardımcı oldu ... http: // forums.silverlight.net/t/184882.aspx/1 – Erix

+3

Covariance, SL4'te desteklenir ve IEnumerable gibi BCL türlerinde sadece SL5'te Covariant yapılır, bu [SO yanıtı] (http://stackoverflow.com/a/2558592)/872.395) – nemesv