我有一个基类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
和Baz
实例添加到列表中,但是我不能这样做:无法从
Bar
转换为Foo<MessageBase>
和
无法从
Baz
转换为Foo<MessageBase>
我想将
Bar
和Baz
实例添加到列表中。我怎样才能做到这一点 ? 最佳答案
在这种情况下,应声明interface IFoo<out T>
而不是abstract class Foo<T>
。 out关键字表示协方差,它将允许您执行所需的操作,即将实现Bar
/ Baz
的IFoo<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/