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吗?还是我做错了什么?

C#中通用接口的协方差

您的声明实际上需要两个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实现的不必要的重复。