2012-08-13 34 views
6

確切的代碼我試圖建立:這是一個無效的差異?

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

     IEnumerable<T> GetRooms(); 
    } 

我得到這個錯誤: 無效方差:類型參數「T」必須是「MapLibrary.IMapContainer.GetRooms()」目不暇接有效。 'T'是協變的。

我的印象是,這將是有效的,因爲IEnumerable只是返回項目,並且都不能添加。爲什麼這不安全+有效?

+0

對不起,但爲什麼'出T'?你需要那個'出'嗎? – 2012-08-13 19:37:39

+0

爲什麼T從界面輸出參數?你想達到什麼目的?從我的角度來看,這看起來奇怪/錯誤。 – 2012-08-13 19:39:49

+1

@ Xtian,Andre,http://msdn.microsoft.com/en-us/library/dd997386.aspx。 – 2012-08-13 19:44:31

回答

7

確保你沒有針對舊的框架版本。 IEnumerable<T>是從.NET 4開始的協變。你的代碼在.NET 4下編譯得很好,並且因爲你在.NET 3.5中提到的錯誤而失敗。

+0

我實際上是針對這裏的Silverlight 4框架.. – Erix 2012-08-13 20:00:07

+0

似乎協調不支持在SL4中的IEnumerable。您的答案幫助我發現,雖然我不明白爲什麼這是... http:// forums.silverlight.net/t/184882.aspx/1 – Erix 2012-08-13 20:04:49

+3

協方差是在SL4中支持的,只是像IEnumerable的BCL類型只是在SL5中做成協變而已,請參閱[SO回答](http://stackoverflow.com/a/2558592/872395) – nemesv 2012-08-13 20:06:41