C#.NET中通用接口的协方差

时间:2015-11-22 12:48:11

标签: c# generics covariance

我有一组看起来像这样的接口:

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?或者我弄错了什么?

1 个答案:

答案 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 ItemItem Item是两回事。

从您的设计中不清楚为什么您需要单独的IMyContainer导致此问题。请尝试删除IMyContainer,因为在第一眼看来,这是IBaseContainer实施的不必要的重复。

相关问题