Domanda

Ho appena non capisco come sarebbe così utile per convertire un contenitore generico nell'altra?

Stack <IType> stack = new Stack<SomeType>();
È stato utile?

Soluzione

Stai parlando conversioni in questo modo?

IFoo<Child> child = ...;
IFoo<Parent> parent = child;

Se è così, questo è ciò che è noto come covarianza. Questo è di solito associato con il suo omologo contravariant. Questa funzione non è infatti disponibile nella versione corrente di C #. Ma sarà disponibile nella prossima versione di C # e VB.Net.

Alcuni articoli sulla prossima release

Altri suggerimenti

Mentre quello @JaredPar dice è vero, ci sono alcuni work-around per collezioni che sono oggi disponibili. Per esempio, è possibile utilizzare l'estensione IEnumerable Fusioni se c'è un cast legale da un tipo all'altro.

List<Foo> list = barList.Cast<Foo>().ToList();

Oppure si potrebbe esplicitamente la conversione da un tipo ad un altro utilizzando Select.

List<double> dList = intList.Select( i => Convert.ToDouble( i ) ).ToList();

Si noti che entrambi questi metodi produrrà una nuova collezione di tipo appropriato, non semplicemente assegnare la collezione a una variabile di tipo diverso, come saranno disponibili in determinate condizioni nelle prossime versioni di C # / VB.

Per quanto riguarda l'esempio che ha dato:

Stack <IType> stack = new Stack<SomeType>();

Che cosa accadrebbe se abbiamo fatto questo:

stack.Add(new SomeOtherTypeNotDerivedFromSomeType());

Questa è la ragione fondamentale per cui covarianza non è consentito in Net, credo perché la collezione di fondo per il contenitore generico non corrisponde necessariamente il tipo dichiarato. Gli articoli di Eric Lippert vanno in grande dettaglio (più di quanto io davvero possibile).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top