协方差问题与接口中的通用集合问题

时间:2013-02-08 03:21:26

标签: c# generics mono covariance xamarin

我有点困惑,为什么我在这里遇到这个错误。由于我已将T声明为out,因此返回其类型不应该没问题吗?

public interface IWebFeed<out T> where T : BaseItem
{
    List<T> getItems();

    void loadFeed();
}

相反,我得到:

  

协变类型参数T' must be invariantly valid on Shared.Service.Feed.IWebFeed.getItems()'

编辑:所以,正如mbeckish指出的那样,在他的链接中,将List<T>更改为IEnumberable<T>应解决此问题,但是当我遵循{{1}的声明时我得到以下内容:

IEnumerable

这是Xamarin或他们的PCL中的错误吗? using System; namespace System.Collections.Generic { public interface IEnumerable<T> : IEnumerable { // // Methods // IEnumerator<T> GetEnumerator(); } } 不是T的事实?

2 个答案:

答案 0 :(得分:1)

MonoTouch(Xamarin)尚不支持界面差异,因为Mono最近添加了界面差异,所以未来版本应该会出现。

答案 1 :(得分:-1)

您需要将GetItems方法的定义更改为以下内容...

List<BaseItem> GetItems();

这是因为您声明T限制它必须符合BaseItem的形状,因此为了保持方差,您必须限制列表中的项目类型。这允许您创建多个BaseItem类列表并交换它们而无需显式转换。