我有一组看起来像这样的接口:
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.Item'无法实现'IBaseContainer.Item',因为它没有匹配的返回类型'IBaseItem'。
所以我的问题是:不应该Container实现IBaseContainer,因为它实现的IBaseContainer相当于协方差的IBaseContainer?或者我弄错了什么?
答案 0 :(得分:0)
您的声明实际上需要两个 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
实施的不必要的重复。