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

问题描述 投票:0回答:2

我有点困惑为什么会出现这个错误。既然我已经将

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>
更改为
IEnumerable<T>
应该可以解决此问题,但是当我遵循
IEnumerable
的声明时,我得到以下内容:

using System;

namespace System.Collections.Generic
{
    public interface IEnumerable<T> : IEnumerable
    {
        //
        // Methods
        //

        IEnumerator<T> GetEnumerator();
    }
}

这是 Xamarin 或其 PCL 中的错误吗?事实上

T
不是
out

c# generics mono covariance xamarin
2个回答
1
投票

MonoTouch (Xamarin) 尚不支持界面差异,并且应该会在未来版本中提供,因为 Mono 最近添加了界面差异。


-1
投票

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

List<BaseItem> GetItems();

这是因为您声明了对

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

© www.soinside.com 2019 - 2024. All rights reserved.