方差无效

时间:2012-01-11 16:53:50

标签: .net c#-4.0 windows-phone-7.1

我有以下界面定义:

public interface IResEnume<out TModel> : IEnumerable<TModel> where TModel : IModel
{
}

IModel是

public interface IModel
{
    int Id { get; }
}

当目标框架是.NET 4时,这很好。

我正在尝试将类库移植到Windows Phone 7.1。

执行此操作时,我收到以下错误:

  

无效方差:类型参数'TModel'必须在'System.Collections.Generic.IEnumerable'上无效且&gt;。 'TModel'是协变的。

如果我删除该行编译的'out',但我在其他地方遇到错误。

1 个答案:

答案 0 :(得分:3)

这是因为T上的IEnumerable<T>参数在Silverlight中不是协变的。方便的是,MSDN说它协变,但在社区内容中,其他人指出同样的事情:

  

尽管有上述文档,但泛型类型参数T在Silverlight中似乎不是协变的。

我们可以在对象浏览器中验证这一点。在.NET Framework 4中:

.NET 4

请注意,类型声明包含out

对于Windows Phone 7:

Silverlight

Windows Phone out中没有IEnumerable。您无法声明TModel协变,因为IEnumerable<T>并不保证它是协变。没有理由不是这种情况;微软只需要更新它。

编辑:经过一番挖掘后,看起来这是Microsoft Connect上的known issue,标记为“已修复”。 Silverlight 5可能已经修复了;哪个Windows Phone尚未使用。