C#中通用接口的协方差
本文关键字:方差 接口 | 更新日期: 2023-09-27 18:23:47
我有一组接口,如下所示:
interface IBaseItem { }
interface IDerivedItem : IBaseItem { }
class Item : IDerivedItem { }
interface IBaseContainer<out TItem>
where TItem : IBaseItem
{
TItem Item { get; }
}
interface IDerivedContainer<out TItem> : IBaseContainer<TItem>
where TItem : IDerivedItem
{ }
class Container<TItem> : IDerivedContainer<TItem>
where TItem : IDerivedItem
{
public TItem Item
{
get { return default(TItem); }
}
}
interface IMyContainer : IBaseContainer<IBaseItem> { }
class MyContainer : Container<Item>, IMyContainer { }
当我尝试编译它时,编译器会说:"MyContainer"没有实现接口成员"IBaseContainer.Item"。"Container.IItem"无法实现"IBaseContainer.Item",因为它没有匹配的返回类型"IBaseItem"。
所以我的问题是:Container不应该实现IBaseContainer吗?还是我做错了什么?
您的声明实际上需要两个Item
属性,如下所示:
class MyContainer : Container<Item>, IMyContainer
{
public new IBaseItem Item { get { … } }
}
原因是实现IBaseContainer<IBaseItem>
会导致IBaseItem Item { get; }
属性,而实现Container<Item>
则会导致实现IDerivedContainer<Item>
,因此IBaseContainer<Item>
意味着Item Item { get; }
属性。从本质上讲,IBaseItem Item
和Item Item
是两种不同的东西。
从您的设计中不清楚您为什么想要一个单独的IMyContainer
,这导致了这个问题。尝试删除IMyContainer
,因为乍一看它是IBaseContainer
实现的不必要的重复。