gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:33:03 25 4
gpt4 key购买 nike

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

BarBaz继承自 Foo<T> T 的类型是 MessageBase我希望我应该能够添加 BarBaz列表中的实例,但是由于以下原因我不能:

Can not convert from Bar to Foo<MessageBase>

Can not convert from Baz to Foo<MessageBase>

我要添加 BarBaz列表中的实例。我该怎么做?

最佳答案

在这种情况下,您应该声明 interface IFoo<out T>而不是 abstract class Foo<T> . out 关键字,这意味着 covariance,将允许您执行所需的操作,即转换 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# 基类型列表添加通用子实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51778920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com