将B添加到List <a <object>&gt;,其中B使用值类型实现A.

时间:2016-03-25 23:48:34

标签: c# generics inheritance covariance

给出以下类型和片段:

interface IFoo<out T> {
    T doThing();
}

class Bar : IFoo<int> {
    int doThing() => 0;
}

var list = new List<IFoo<object>> {
    new Bar() //fails to compile
};

我知道无法向Bar添加List<IFoo<object>>,因为Bar T是值类型。

鉴于我需要IFoo类型安全,我如何更改Bar或集合,以便可以将IFoo<T>存储为某些值和参考类型?

1 个答案:

答案 0 :(得分:3)

基本上我只看到一个选项:

    public interface IFoo<out T>:IFoo
    {
        T doThing();
    }

    public interface IFoo
    {
        object doThing();
    }

    public class Bar : IFoo<int>
    {
        public int doThing(){return 0;}
        object IFoo.doThing()
        {
            return doThing();
        }
    }

    var list = new List<IFoo> 
    {
        new Bar()
    };