我有一个基类MessageBase
public abstract class MessageBase {}
Message1D
和Message2D
继承自MessageBase
public class Message1D : MessageBase {}
public class Message2D : MessageBase {}
我还有一个通用类Foo
,其通用参数类型为MessageBase
public abstract class Foo<T> where T : MessageBase {}
还有两个类Bar
和Baz
:
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
}
}
由于Bar
和Baz
从Foo<T>
继承而T为MessageBase
类型,所以我希望我应该能够添加Bar
和{{1 }}实例到列表中,但是由于以下原因,我不能这样做:
无法从
Baz
转换为Bar
和
无法从
Foo<MessageBase>
转换为Baz
我想将Foo<MessageBase>
和Bar
实例添加到列表中。我该怎么办?
答案 0 :(得分:3)
在这种情况下,您应该声明interface IFoo<out T>
而不是abstract class Foo<T>
。 out 关键字(表示协方差)将允许您执行所需的操作,即强制转换Bar
/ Baz
类,这些类实现了{{1} } / IFoo<Message1D>
,移至IFoo<Message2D>
界面:
IFoo<MessageBase>