C# 列表中的协方差

C# 列表中的协方差,c#,.net,C#,.net,我们如何正确地设计以下模型?我有两个班级的图书馆。图书馆2参考了图书馆1。但是库1没有库2的参考 库1: public class BaseData { /*Some Properties*/ } public class BaseGroup { /*Some data*/ public List<BaseData> DataList; } public class ChildData : BaseData { /*Some more data*/ }

我们如何正确地设计以下模型?我有两个班级的图书馆。图书馆2参考了图书馆1。但是库1没有库2的参考

库1:

public class BaseData
{
   /*Some Properties*/
}

public class BaseGroup
{
   /*Some data*/
   public List<BaseData> DataList;
}
public class ChildData : BaseData
{
   /*Some more data*/
}

public class ChildGroup
{
   /*Some more data*/
   public List<ChildData> DataList;
}
公共类基本数据
{
/*一些性质*/
}
公共类基组
{
/*一些数据*/
公共列表数据列表;
}
库2:

public class BaseData
{
   /*Some Properties*/
}

public class BaseGroup
{
   /*Some data*/
   public List<BaseData> DataList;
}
public class ChildData : BaseData
{
   /*Some more data*/
}

public class ChildGroup
{
   /*Some more data*/
   public List<ChildData> DataList;
}
公共类ChildData:BaseData
{
/*更多数据*/
}
公营儿童组
{
/*更多数据*/
公共列表数据列表;
}
我如何设计这些模型,使我有一个列表。该列表可以在库1中启动,然后在库2中更新。同样从库2中,我需要将
ChildGroup
对象传递给库1方法,该方法将
BaseGroup
作为参数。

您不能使
列表
协变-它是不变的,您对此无能为力。您不能将
列表
视为
列表
,因为您不能调用
List.Add(new Orange())

在我看来,您应该将
baseGroup
类设置为泛型,并带有一个约束。然后您可以使
childGroup
从中派生:

因此-已将类名固定为遵循.NET命名约定:

public class BaseData {}

public class BaseGroup<T> where T : BaseData
{
    public List<T> DataList;
}

public class ChildData : BaseData {}

public class ChildGroup : BaseGroup<ChildData>
{
    // No need for a separate list here
}
公共类基本数据{}
公共类基组,其中T:BaseData
{
公共列表数据列表;
}
公共类ChildData:BaseData{}
公共类ChildGroup:BaseGroup
{
//这里不需要单独的列表
}

标题与问题无关。你能不能只添加一个从库1到库2的引用?@MarcusMüller:确实如此,尽管做得不太好。@MarcusMüller:这不是C#中使用的术语@马库斯穆勒:在数学的多个分支中都有这样一种观点,即两个事物可以以某种相关的方式变化。这里的用法来自范畴理论,而不是统计学。