我有一个基类MessageBase

public abstract class MessageBase {}


Message1DMessage2D继承自MessageBase

public class Message1D : MessageBase {}
public class Message2D : MessageBase {}


我也有一个通用类Foo,其通用参数类型为MessageBase

public abstract class Foo<T> where T : MessageBase {}


还有两个类BarBaz

public class Bar : Foo<Message1D> {}
public class Baz : Foo<Message2D> {}


我的问题在这里:

public class Network
{
    private List<Foo<MessageBase>> messages = new List<Foo<MessageBase>>();

    public void AddBar()
    {
        messages.Add(new Bar()); //can not add
    }

    public void AddBaz()
    {
        messages.Add(new Baz()); //can not add
    }
}


由于BarBaz继承自Foo<T>并且T的类型为MessageBase我希望我应该能够将BarBaz实例添加到列表中,但是我不能这样做:


  无法从Bar转换为Foo<MessageBase>





  无法从Baz转换为Foo<MessageBase>


我想将BarBaz实例添加到列表中。我怎样才能做到这一点 ?

最佳答案

在这种情况下,应声明interface IFoo<out T>而不是abstract class Foo<T>。 out关键字表示协方差,它将允许您执行所需的操作,即将实现Bar / BazIFoo<Message1D> / IFoo<Message2D>类转换为IFoo<MessageBase>接口:

public abstract class MessageBase { }

public class Message1D : MessageBase { }
public class Message2D : MessageBase { }

public interface IFoo<out T> where T : MessageBase { }

public class Bar : IFoo<Message1D> { }
public class Baz : IFoo<Message2D> { }

public class Network
{
    private List<IFoo<MessageBase>> messages = new List<IFoo<MessageBase>>();

    public void AddBar()
    {
        messages.Add(new Bar());
    }

    public void AddBaz()
    {
        messages.Add(new Baz());
    }
}

关于c# - C#基本类型列表添加通用子代实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51778920/

10-10 12:25