Reputation: 4125
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
toFoo<MessageBase>
and
Can not convert from
Baz
toFoo<MessageBase>
I want to add Bar
and Baz
instances to the List. How can I do that ?
Upvotes: 2
Views: 446
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