我有点困惑为什么会出现这个错误。既然我已经将
T
声明为 out
,那么返回它的类型不是应该可以吗?
public interface IWebFeed<out T> where T : BaseItem
{
List<T> getItems();
void loadFeed();
}
相反,我得到:
协变类型参数
Shared.Service.Feed.IWebFeed.getItems()'T' must be invariantly valid on
编辑:因此,正如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
?
MonoTouch (Xamarin) 尚不支持界面差异,并且应该会在未来版本中提供,因为 Mono 最近添加了界面差异。
您需要将 GetItems 方法的定义更改为以下...
List<BaseItem> GetItems();
这是因为您声明了对
T
的限制,即它必须适合 BaseItem
的形状,因此为了保持方差,您必须限制列表中的项目类型。这允许您创建多个 BaseItem
类列表并互换它们,而无需显式转换。