C# 通用包装器对象列表

C# 通用包装器对象列表,c#,list,generics,unity3d,C#,List,Generics,Unity3d,有人能告诉我为什么不能向列表中添加一个包含具有继承性的泛型类的包装器吗 public abstract class SectorObject{} public class SpawnPoint : SectorObject public class Trigger : SectorObject public class SectorObjectList<T> where T : SectorObject { public List<T> items ; }; pu

有人能告诉我为什么不能向列表中添加一个包含具有继承性的泛型类的包装器吗

public abstract class SectorObject{} 
public class SpawnPoint : SectorObject
public class Trigger : SectorObject
public class SectorObjectList<T>  where T : SectorObject { public List<T> items ; };


public List<SectorObjectList<SectorObject>> objectLists = new List<SectorObject< SectorObject>>();

SectorObjectList <SpawnPoint> spawnPoints = new SectorObjectList<SpawnPoint>();

objectLists.Add(spawnPoints);  // This line doesn't work.
公共抽象类SectorObject{}
公共类生成点:SectorObject
公共类触发器:SectorObject
公共类SectorObjectList,其中T:SectorObject{public List items;};
public List objectLists=新列表>();
SectorObjectList spawnPoints=新的SectorObjectList();
objectlist.Add(生成点);//这条线不行。
它的工作原理如下:

public List<SectorObjectList<SpawnPoint>> objectLists = new List<SectorObject< SpawnPoint>>();
SectorObjectList <SpawnPoint>spawnPoints = new SectorObjectList<SpawnPoint>();
objectLists.Add(spawnPoints);  
public List objectLists=new List>();
SectorObjectList spawnPoints=新的SectorObjectList();
objectLists.Add(生成点);

干杯。

经典协方差/逆变问题。你可以在Stack Overflow上找到很多相关文章。在不进行强制转换和转换的情况下,您应该使用抽象类进行声明,使用具体类进行初始化:

List<SectorObjectList<SectorObject>> objectLists = 
    new List<SectorObjectList<SectorObject>>();
SectorObjectList<SectorObject> spawnPoints = new SectorObjectList<SectorObject>();
spawnPoints.items = new List<SectorObject>();
spawnPoints.items.Add(new SpawnPoint());
objectLists.Add(spawnPoints);

编译器告诉您什么(可能有用)信息?与'System.Collections.Generic.List.Add(SectorObjectList)'匹配的最佳重载方法有一些无效的参数,这似乎很奇怪。当我使用继承时,我不明白为什么没有这种重载方法。我猜编译器看不到
SectorObjectList
不是从
SectorObjectList
派生出来的,泛型实际上只是语法上的糖分,可以防止您编写几乎相同的类等。这里的两种类型实际上并不像
SectorObject
SpawnPoint
那样相关。您可以始终使用基类的列表,没有任何东西可以阻止您向这样的集合添加
SpawnPoint
s
var spawnPoints2 = new SectorObjectList<SpawnPoint>() { 
    items= new List<SpawnPoint>()};
var spawnPointsCopy = new SectorObjectList<SectorObject>() { items= spawnPoints2.items.Cast<SectorObject>().ToList() };
objectLists.Add(spawnPointsCopy);