Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#基类型列表添加泛型子实例_C#_List_Generics_Inheritance - Fatal编程技术网

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

C#基类型列表添加泛型子实例,c#,list,generics,inheritance,C#,List,Generics,Inheritance,我有一个基类MessageBase public abstract class MessageBase {} Message1D和Message2D继承自MessageBase public class Message1D : MessageBase {} public class Message2D : MessageBase {} public abstract class Foo<T> where T : MessageBase {} 我还有一个泛型类Foo,其泛型参数类

我有一个基类
MessageBase

public abstract class MessageBase {}
Message1D
Message2D
继承自
MessageBase

public class Message1D : MessageBase {}
public class Message2D : MessageBase {}
public abstract class Foo<T> where T : MessageBase {}
我还有一个泛型类
Foo
,其泛型参数类型为
MessageBase

public class Message1D : MessageBase {}
public class Message2D : MessageBase {}
public abstract class Foo<T> where T : MessageBase {}
我的问题是:

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 
    }
}
公共类网络
{
私有列表消息=新列表();
公共void AddBar()
{
messages.Add(new Bar());//无法添加
}
公共无效AddBaz()
{
messages.Add(new Baz());//无法添加
}
}
由于
Bar
Baz
继承自
Foo
,并且T的类型为
MessageBase
,我希望我能够将
Bar
Baz
实例添加到列表中,但是由于以下原因,我无法添加到列表中:

无法从
Bar
转换为
Foo

无法从
Baz
转换为
Foo


我想将
Bar
Baz
实例添加到列表中。我该怎么做呢?

在这种情况下,您应该声明
接口IFoo
,而不是
抽象类Foo
out关键字,意思是协方差,将允许您执行所需的操作,即将实现
IFoo
/
IFoo
接口的
Baz
类投射到
IFoo
接口:

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());
    }
}
公共抽象类MessageBase{}
公共类Message1D:MessageBase{}
公共类Message2D:MessageBase{}
公共接口IFoo,其中T:MessageBase{}
公共类栏:IFoo{}
公共类Baz:IFoo{}
公共班级网络
{
私有列表消息=新列表();
公共void AddBar()
{
messages.Add(新条());
}
公共无效AddBaz()
{
messages.Add(新的Baz());
}
}

您的问题是什么?@vasily.sib我想将Bar和Baz实例添加到列表中。我该怎么做?
Foo
不是从
Foo
继承的,所以您现在不能。您可以向
Foo
Foo
添加一些公共接口,并更改
消息的定义。