IReadOnlyDictionary缺乏协方差

时间:2013-07-26 10:37:19

标签: c# dictionary interface covariance

我已阅读相关问题(How to get around lack of covariance with IReadOnlyDictionary?),但我不明白它对我的问题有何帮助。

以下Box可以编辑(使用IBoxTarget)并通知有关更改(使用IBoxSource):

interface IBoxTarget
{
    void DoSomething();
}

interface IBoxSource
{
    event Action SomethingIsDone;
}

class Box : IBoxTarget, IBoxSource
{
    public void DoSomething()
    {
        // . . . some logic . . .

        if (SomethingIsDone != null) SomethingIsDone();
    }

    public event Action SomethingIsDone;
}

RoomBox的容器。它还实现了两个接口:

interface IRoomTarget
{
    IReadOnlyDictionary<string, IBoxTarget> Boxes { get; }
}

interface IRoomSource
{
    IReadOnlyDictionary<string, IBoxSource> Boxes { get; }
}

class Room : IRoomTarget, IRoomSource
{
    Dictionary<string, Box> boxes = new Dictionary<string, Box>();

    IReadOnlyDictionary<string, IBoxTarget> IRoomTarget.Boxes
    {
        get { return boxes; } // Error: "Cannot implicitly convert type ..."
    }

    IReadOnlyDictionary<string, IBoxSource> IRoomSource.Boxes
    {
        get { return boxes; } // Error: "Cannot implicitly convert type ..."
    }
}

我不想在Room内创建两个不同的词典。我需要做什么?

1 个答案:

答案 0 :(得分:0)

在我的特殊情况下,这有助于:

interface IRoomTarget
{
    IBoxTarget this[string name] { get; }
}

interface IRoomSource
{
    IBoxSource this[string name] { get; }
}

class Room : IRoomTarget, IRoomSource
{
    Dictionary<string, Box> boxes = new Dictionary<string, Box>();

    public IBoxTarget IRoomTarget.this[string name]
    {
        get { return boxes[name]; }
    }

    IBoxSource IRoomSource.this[string name]
    {
        get { return boxes[name]; }
    }
}

但我不确定这是通用解决方案