2009-11-22 11 views
40

voglio fare qualcosa di simile:In C#, è possibile trasmettere un elenco <Child> all'elenco <Parent>?

List<Child> childList = new List<Child>(); 
... 
List<Parent> parentList = childList; 

Tuttavia, poiché parentList è una lista di antenato di bambino, piuttosto che un antenato diretto, non sono in grado di fare questo. C'è un rimedio (oltre all'aggiunta di ogni elemento singolarmente)?

+3

Non è un duplicato esatto, ma c'è una domanda molto simile qui: http://stackoverflow.com/questions/1569774/ienumerablet-conversion – bcat

+0

http://stackoverflow.com/questions/23248016/why-does-my-inheritance-not-work-in-my-example --- Dai un'occhiata qui –

risposta

52

Casting direttamente non è consentito perché non c'è modo di farlo Typesafe. Se hai una lista di giraffe e la lanci in una lista di animali, potresti mettere una tigre in una lista di giraffe! Il compilatore non ti fermerebbe, perché ovviamente una tigre potrebbe entrare in una lista di animali. L'unico posto in cui il compilatore può fermarti è la conversione non sicura.

In C# 4 supporteremo la covarianza e la contravarianza delle interfacce SAFE e dei tipi delegati che sono parametrizzati con i tipi di riferimento. Vedi qui per maggiori dettagli:.

http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx

+111

Ancora peggio, se il compilatore ti permette di farlo, la tua lista finirebbe più piccola del previsto perché la tigre mangerebbe alcune delle giraffe. – JoeCool

48

utilizzando LINQ:

List<Parent> parentList = childList.Cast<Parent>().ToList(); 

Documentation for Cast<>()

+1

Nota che questo crea una copia di 'childList', esattamente come il not- utilizzando la versione LINQ di @Andre Pena. – dtb

+3

Elenco parentList = childList.OfType () .ToList(); funziona anche, ed è preferibile nei casi in cui si è meno sicuri del contenuto della lista di partenza. –

+1

@dtb, si ottiene una nuova lista, ma ho il sospetto che ci siano buone possibilità che gli oggetti nella lista siano gli stessi oggetti. –

-3

È possibile farlo utilizzando approccio Linq di applicare il metodo estensione cioè Lista parentList = childList.Cast() ToList();

0

sì, si può fare come

var result = List.And(x => x.Parent.All(b => b.ParentId == value)); 
Problemi correlati