C#基本类型列表添加通用子代实例

时间:2018-08-10 04:20:08

标签: c# list generics inheritance

我有一个基类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 
    }
}

由于BarBazFoo<T>继承而T为MessageBase类型,所以我希望我应该能够添加Bar和{{1 }}实例到列表中,但是由于以下原因,我不能这样做:

  

无法从Baz转换为Bar

  

无法从Foo<MessageBase>转换为Baz

我想将Foo<MessageBase>Bar实例添加到列表中。我该怎么办?

1 个答案:

答案 0 :(得分:3)

在这种情况下,您应该声明interface IFoo<out T>而不是abstract class Foo<T> out 关键字(表示协方差)将允许您执行所需的操作,即强制转换Bar / Baz类,这些类实现了{{1} } / IFoo<Message1D>,移至IFoo<Message2D>界面:

IFoo<MessageBase>