2012-08-13 35 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