Hallo!
Nach meinem Wissensstand sollte doch eigentlich jede Klasse irgendwie mit der Klasse "Object" verwandt sein. Und es stellt normalerweise kein Problem dar ein Objekt einer abgeleiteten Klasse in eines der Vorfahren zu konvertieren.
Warum funktioniert aber folgende Zeile nicht:
List<string> list = (List<string>)(new object());
?
Hintergedanke:
Ich wollte mir eine Methode schreiben, in der ich generisch Listeninhalte erzuegen kann, was auch bei eindimensionalen Listen kein Problem darstellt, bei mehrdimensionalen schon. (siehe Codeschnippsel)
Hat jemand eine Idee?
Ich danke euch für eure Hilfe! 😃
Grüße
Hallo Umpalumpa,
Nach meinem Wissensstand sollte doch eigentlich jede Klasse irgendwie mit der Klasse "Object" verwandt sein. Und es stellt normalerweise kein Problem dar ein Objekt einer abgeleiteten Klasse in eines der Vorfahren zu konvertieren.
Ja, das schon.
In deinem Beispiel machst du das aber genau anders herum: Du erzeugst ein Object und willst es in eine seiner Unterklassen konvertieren - das klappt natürlich nicht.
Das geht nur, wenn das Objekt, das du konvertierst, auch tatsächlich ein Objekt dieser Unterklase (bzw. eines einer weiteren Unterklasse) ist.
Vermutlich suchst du Reflection bzw. im Speziellen die Methode Activator.CreateInstance in Verbindung mit typeof(List<>).MakeGenericType
.
new object() war nie eine Liste und kann viel weniger als deine Liste - also warum solltest du den Cast machen dürfen?
Andersrum würde gehen, also
object o = (object)new List<T>();
und mehrdimensionale Listen kann man mit List<List<T>> machen.
Wenn du Keys brauchst, dann Dictionary<Key<Dictonary<Key, Value>>.
Oft lohnt es sich dann entsprechende Klassen zu erstellen, die einen sprechenderen Namen haben.
Andersrum würde gehen
sogar ohne Cast, also
object o = new List<T>();
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
Der Denkfehler ist mir auch grad beim weiteren Testen klar geworden. ^^
@winSharp93
Die Reflections werd ich mir mal anschauen. Danke!
@Grumbler85
Mehrdimensionale Listen erzeugen ist nicht das Problem, nur gebe ich als Parameter eine n-dimensionale Liste an die Methode, und es sollen dann weitere leere Elemente hinzugefügt werden.
Ich könnte jetzt anfangen für n Dimensionen Methoden zu schreiben, was aber nicht praktikabel wäre, da dann vielleicht eine für die n+1te Dimension benötigt wird. Daher wollte ich es gerne schön generisch in einer regeln.
Sie müssen über eine "Boxing und Unboxing" lesen.
Das bedeutet,dass bevor Sie unboxing können, Sie müssen ein List zu object einwickeln.
Beispiel:
List<string> list;// = (List<string>)(new object());//Fails
object boxedListObject = new List<string>();
list = (List<string>) (boxedListObject);
Vergessen Sie einige Tricks nicht.
double e = 2.718281828459045;
object o = e; // box
int ee = (int)o; // runtime exception
zuerst wir müssen die double ((double)o) auspacken.
Danach Sie können die 'double' in eine int auspacken.
Bevor wir jetzt erneut in das Boxing-Thema einsteigen, sei auf Boxing/Unboxing: Es wird in Büchern immer erwähnt, aber welchen Vorteil bringt es mit sich? verweisen.