考虑一个例子:
我有一个这样的界面.我需要这个接口是协变的——这意味着我必须将我的泛型声明为"out",并使用IEnumerable而不是list——仅此而已.我将使用它来简单地获取我需要的元素——无需插入任何内容.
public interface IFoo<out T>
{
IEnumerable<T> Items { get; }
}
然后我让我的具体课程声明如下:
public class Foo : IFoo<Item>
{
// I have an error here : Type IList doesn't match the expected type IEnmerable
IList<Item> Items { get; set; }
}
我想知道为什么这不可能?我的意思是IList继承了IEnumerable,这种类型的代码工作得非常好.
public IEnumerable<Item> GetItems()
{
return new List() { new Item())};
}
为什么可以这样做?解决办法是什么?
我唯一的解决方案是,我可以创建这样的附加属性或方法
public IEnumerable<Item> GetEnumerableItems()
{
return Items;
}
但它对我来说太黑了.我想可能有一个更干净的解决方案.