我有以下界面定义:
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',但我在其他地方遇到错误。
答案 0 :(得分:3)
这是因为T
上的IEnumerable<T>
参数在Silverlight中不是协变的。方便的是,MSDN说它是协变,但在社区内容中,其他人指出同样的事情:
尽管有上述文档,但泛型类型参数T在Silverlight中似乎不是协变的。
我们可以在对象浏览器中验证这一点。在.NET Framework 4中:
请注意,类型声明包含out
。
对于Windows Phone 7:
Windows Phone out
中没有IEnumerable
。您无法声明TModel
协变,因为IEnumerable<T>
并不保证它是协变。没有理由不是这种情况;微软只需要更新它。
编辑:经过一番挖掘后,看起来这是Microsoft Connect上的known issue,标记为“已修复”。 Silverlight 5可能已经修复了;哪个Windows Phone尚未使用。