Entwickler-Ecke

Basistechnologien - Typecast generischer listen


Master_BB - Mi 03.06.09 14:33
Titel: Typecast generischer listen
Hallo, ich habe folgendes komplexes Problem in dessen Kern wohl steckt wie ich den Typ einer Generischen Liste zu fassen bekomme.

Wir haben

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  List<C> lc = new List<C>;
  List<B> lb = new List<B>;
  List<A> la = new List<A>;
  //B,C ist abgeleitet von A (A=Basisklasse)
  
  forall (Object[] item in new Object[]{ new Object[]{ lc, otherObjs }
                                         new Object[]{ lb, otherObjs }
                                       })
  {
    la = item[0as List<A> //DIES HÄTTE ICH GERN GEHT ABER NICHT!
  }

Ihr seht in der Forschleife können 2 Verschiedene Generische Listen kommt die jedoch
Typmäßig auf List<A> runtergebrochen werden könnten.
Wie mache ich diesen Typecast mit ConvertAll<>?

wenn da jemand eine lösung hätte wäre ich extrem FROH!
THX


Kha - Mi 03.06.09 14:43

Etwas merkwürdige Konstruktion, Typsicherheit ist was anderes ;) .
Was du suchst, nennt sich Kovarianz [http://de.wikipedia.org/wiki/Kontravarianz_(Informatik)]. Das kann aber a) erst C# 4.0 und b) ist List<T> invariant.
IEnumerable<T> ist aber zum Glück kovariant, was auch unter .NET 3.5 leicht simuliert werden kann:

C#-Quelltext
1:
2:
3:
4:
5:
forall (Object[] item in new Object[]{ new Object[]{ lc.Cast<A>(), otherObjs }
                                         new Object[]{ lb.Cast<A>(), otherObjs }
                                       }) {
  var la = (IEnumerable<A>)item[0];
}