2014-11-07 3 views
1

Может ли кто-нибудь сказать мне, почему я не могу добавить в список оболочку, содержащую общий класс с наследованием?Список общих объектов Wrapper

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. 

Он работает только как это:

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

Приветствия.

+0

Какая (возможно, полезная) информация компилятор говорит вам? –

+0

Наилучшее перегруженное соответствие метода для 'System.Collections.Generic.List >. Добавить (SectorObjectList ) 'имеет некоторые недопустимые аргументы – user2550696

+0

Кажется странным. Я не понимаю, почему такого перегруженного метода нет, когда я использую наследование. – user2550696

ответ

1

Классическая проблема ковариации/контравариантности. Вы можете найти много связанных сообщений в Stack Overflow, like this one. Без литья и преобразования вы должны использовать абстрактный класс для деклараций и конкретных классов для инициализации:

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); 

Если SectorObjectList был связан с SpawnPoint в явном виде, то вы могли бы уйти с Отдавая свой адаптируемый:

var spawnPoints2 = new SectorObjectList<SpawnPoint>() { 
    items= new List<SpawnPoint>()}; 
var spawnPointsCopy = new SectorObjectList<SectorObject>() { items= spawnPoints2.items.Cast<SectorObject>().ToList() }; 
objectLists.Add(spawnPointsCopy);