koryakinp
koryakinp

Reputation: 4125

C# List of base type add generic children instance

I have a base class MessageBase

public abstract class MessageBase {}

Message1D and Message2D inherit from MessageBase

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

I also have a generic class Foo with a generic parameter of type MessageBase

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

And two classes Bar and Baz:

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

And my problem is here:

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 
    }
}

Since Bar and Baz inherit from Foo<T> and T is of type MessageBase I would expect I should be able to add Bar and Baz instances to the List, however I can not due to:

Can not convert from Bar to Foo<MessageBase>

and

Can not convert from Baz to Foo<MessageBase>

I want to add Bar and Baz instances to the List. How can I do that ?

Upvotes: 2

Views: 446

Answers (1)

Slava Utesinov
Slava Utesinov

Reputation: 13488

At this case, you should declare interface IFoo<out T> instead of abstract class Foo<T>. out keyword, which means covariance, will allow you to perform desired operations, i.e. casting Bar/Baz classes, which implement IFoo<Message1D>/IFoo<Message2D>, to IFoo<MessageBase> interface:

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());
    }
}

Upvotes: 3

Related Questions