In C# kann, warum nicht auch eine Liste<string> Objekt werden in einer Liste gespeichert<object> variable
Scheint es, dass ein List-Objekt kann nicht gespeichert werden, in eine List-variable in C#, und kann auch nicht explizit umgewandelt werden, Weg.
List<string> sl = new List<string>();
List<object> ol;
ol = sl;
Ergebnisse kann Nicht implizit konvertiert Art System.Collections.Generic.List<string>
zu System.Collections.Generic.List<object>
Und dann...
List<string> sl = new List<string>();
List<object> ol;
ol = (List<object>)sl;
Ergebnisse in Nicht konvertieren Typ System.Collections.Generic.List<string>
zu System.Collections.Generic.List<object>
Natürlich, Sie können es durch ziehen alles aus der string-Liste und setzen es wieder in ein zu einer Zeit, aber es ist ein ziemlich verworrenes Lösung.
Dies ist gonna change mit C# 4.0, so dass Sie vielleicht wollen, lookup-Kovarianz und Kontravarianz. Es wird erlauben, dass solche Dinge in einer Art sicheren Art und Weise.
Mehr oder weniger doppelte: stackoverflow.com/questions/317335/...
John> C#4 wird nicht zulassen. Denke, über ol.Add(new object());
Beantwortet von Jon Skeet hier: stackoverflow.com/a/2033921/1070906
Mehr oder weniger doppelte: stackoverflow.com/questions/317335/...
John> C#4 wird nicht zulassen. Denke, über ol.Add(new object());
Beantwortet von Jon Skeet hier: stackoverflow.com/a/2033921/1070906
InformationsquelleAutor Matt Sheppard | 2008-08-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denken Sie an es auf diese Weise, wenn Sie waren zu tun, eine solche Besetzung, und fügen Sie dann ein Objekt vom Typ Foo in die Liste, die Liste von strings ist nicht mehr konsistent. Wenn Sie waren zu Durchlaufen und die erste Referenz, die Sie erhalten würden, eine class cast exception, weil, wenn Sie auf dem Foo-Instanz, die Foo konnte nicht in eine Zeichenfolge konvertiert werden!
Als seitliche Anmerkung, ich denke, es wäre mehr signifikante, ob oder nicht, können Sie tun das Gegenteil Darsteller:
Habe ich noch nicht benutzt, C#, also ich weiß nicht, ob das legal ist, aber diese Art der Besetzung ist eigentlich (potentiell) nützlich. In diesem Fall, sind Sie gehen von einer allgemeineren Klasse (Objekt) an eine spezifische Klasse (string), die sich aus den Allgemeinen eine. Auf diese Weise, wenn Sie hinzufügen, um die Liste der Zeichenfolgen, die Sie nicht gegen die Liste der Objekte.
Weiß jemand, oder kann testen, ob eine solche Besetzung ist legal in C#?
Eric Lippert hat eine große Reihe von blog-posts zu diesem Thema: warum es funktionieren könnte hinzufügen Kovarianz und Kontravarianz Constraints generische Methoden, kann aber nie funktionieren, wie wir möchten in der Klasse. ist.gd/3kQc
Wenn
ol
hatte etwas in ihm, das ist kein string, ich glaube, ich würde erwarten, dass der cast zur Laufzeit scheitern. Aber wo Sie wirklich in Schwierigkeiten geraten ist, wenn ein Zauber erfolgreich war, und dann etwas Hinzugefügt wurdenol
das ist kein string. Dasl
verweist auf das gleiche Objekt, Sie jetzt IhrList<string>
enthalten würde, einem nicht-string. DieAdd
ist das problem, ich glaube, das rechtfertigt, warum dieser code nicht kompilieren, aber es wird kompiliert, wenn Sie ändernList<object> ol
zuIEnumerable<object> ol
, die nicht über eineAdd
. (Ich habe diesen in C# 4.)Mit dieser änderung, es kompiliert, aber wirft ein
InvalidCastException
da die Laufzeitumgebung Art vonol
nochList<object>
.InformationsquelleAutor Mike Stone
Wenn Sie .NET 3.5 haben Sie einen Blick auf das Zählbare.Cast-Methode. Es ist eine Erweiterung Methode, so dass Sie anrufen können es direkt auf die Liste.
Ist es nicht genau das, was Sie bitten, sondern sollten den trick tun.
Edit: Wie bereits von Zooba, Sie können dann aufrufen, ol.ToList() um eine Liste
InformationsquelleAutor Ray
Können Sie nicht gegossen, zwischen den generischen Typen mit verschiedenen Typ-Parameter. Spezialisiert generischen Typen, die nicht Teil des gleichen vererbungsbaum und so nicht verwandten Arten.
Zu diesem pre-NET 3.5:
Mithilfe Von Linq:
InformationsquelleAutor Zooba
Der Grund dafür ist, dass eine generische Klasse wie
List<>
ist für die meisten Zwecke, von außen behandelt wie eine normale Klasse. wenn Sie z.B. sagenList<string>()
der compiler sagtListString()
(die strings enthält). [Technische folk: dies ist eine äußerst plain-Englisch-freundlich-version von, was Los ist]Folglich offensichtlich kann der compiler nicht intelligent genug, um zu konvertieren eine ListString an ein ListObject indem er die Elemente seiner inneren Sammlung.
Deshalb gibt es erweiterungsmethoden für IEnumerable wie Convert (), die Sie einfach liefern Konvertierung für die gespeicherten Elemente in einer Auflistung, die könnte so einfach sein wie die Umwandlung von einem zum anderen.
InformationsquelleAutor Rex M
Dieser hat viel zu tun mit Kovarianz, z.B. generische Typen als Parameter, und wenn die Parameter nicht korrekt aufgelöst werden können, um einen spezifischeren Typ dann schlägt der Vorgang fehl. Die Implikation, so dass Sie können wirklich nicht Stimmen, um einen allgemeineren Typ, wie-Objekt. Und wie bereits von Rex, das List-Objekt nicht konvertiert jedes Objekt für Sie.
Möchten Sie vielleicht versuchen, den ff-code statt:
oder:
ol wird (theoretisch) kopieren Sie den Inhalt des sl ohne Probleme.
InformationsquelleAutor Jon Limjap
Ja, Sie können, aus .NET 3.5:
InformationsquelleAutor Tamas Czinege
Mike - ich glaube, Kontravarianz ist nicht erlaubt in C# entweder
Sehen Generische Typ-parameter Varianz in der CLR für ein paar mehr Infos.
InformationsquelleAutor Matt Sheppard
Ich denke, dass diese (Kontravarianz) tatsächlich unterstützt werden, die in C# 4.0.
http://blogs.msdn.com/charlie/archive/2008/10/27/linq-farm-covariance-and-contravariance-in-visual-studio-2010.aspx
InformationsquelleAutor MattValerio
Das ist tatsächlich so, dass Sie nicht versuchen, jede ungerade "Objekt" in der "ol" - Liste Variante (wie
List<object>
würde scheinen, zu ermöglichen) - weil Sie Ihren code Abstürzen würde, dann (weil die Liste ist wirklichList<string>
und akzeptiert nur String-Objekte des Typs). Das ist, warum Sie können nicht werfen Sie Ihre Variablen zu einer Allgemeinen Spezifikation.Auf Java ist es anders herum, Sie haben keine Generika, und stattdessen ist alles Liste von Objekten zur Laufzeit, und man kann wirklich Sachen seltsame Objekt in Ihre angeblich streng typisierte Liste. Suche nach "Vergegenständlicht generics", um zu sehen, eine breitere Diskussion von java-problem...
InformationsquelleAutor Valters Vingolds
Solche Kovarianz auf Generika ist nicht unterstützt, aber Sie können tatsächlich tun dies mit arrays:
C# führt-Laufzeit überprüft, um zu verhindern, dass Sie setzen, sagen, eine
int
ina
.InformationsquelleAutor Constantin
Hier ist ein weiteres pre-.NET 3.5 Lösung für alle IList, auf deren Inhalt cast implizit.
(Basierend auf Zooba Beispiel)
InformationsquelleAutor Alvin Ashcraft
Ich habe einen:
Und ich werde füllen Sie ihn mit erhobenen Daten in einer
List<object>
Was schließlich für mich gearbeitet hat, war dieses hier:
.Cast
es auf die Art, die Sie wollen zu bekommen eineIEnumerable
aus, dass sich Art, dann die festgelegtenIEnemuerable
zu denList<>
Sie wollen.InformationsquelleAutor Menno
Mm, Dank der vorherigen Kommentare fand ich zwei Möglichkeiten, um es herauszufinden. Der erste ist immer der string-Liste von Elementen, und dann Gießen Sie es auf IEnumerable-Objekt-Liste:
Und der zweite ist die Vermeidung der IEnumerable-Objekt-Typ, nur Gießen Sie die Zeichenfolge-Objekt, und geben Sie dann über die Funktion "toList()" im gleichen Satz:
Mag ich eher den zweiten Weg. Ich hoffe, das hilft.
InformationsquelleAutor Cristinadeveloper
InformationsquelleAutor Kozen