接口中泛型集合的协方差输出问题

本文关键字:方差输 出问题 集合 泛型 接口 | 更新日期: 2023-09-27 17:58:21

我有点困惑,为什么这里会出现这个错误。既然我已经将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()'

EDIT:因此,正如mbeckish所指出的,在他的链接中,将List<T>更改为IEnumberable<T>应该可以解决这个问题,但当我遵循IEnumerable的声明时,我会得到以下结果:

using System;
namespace System.Collections.Generic
{
    public interface IEnumerable<T> : IEnumerable
    {
        //
        // Methods
        //
        IEnumerator<T> GetEnumerator();
    }
}

这是Xamarin或他们的PCL中的错误吗?T不是out

接口中泛型集合的协方差输出问题

MonoTouch(Xamarin)中还不支持接口差异,并且应该会在未来的版本中出现,因为Mono最近添加了接口差异。

您需要将GetItems方法的定义更改为以下。。。

List<BaseItem> GetItems();

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