Cast List<T> Liste<Interface>
public interface IDic
{
int Id { get; set; }
string Name { get; set; }
}
public class Client : IDic
{
}
Wie kann ich warf List<Client>
zu List<IDic>
?
InformationsquelleAutor Andrew Kalashnikov | 2012-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht cast es (Erhaltung Referenz-Identität) - das wäre unsicher. Zum Beispiel:
Jetzt können Sie konvertieren eine
List<Apple>
zu einemIEnumerable<IFruit>
.NET 4 /C# 4 aufgrund der Kovarianz, aber wenn Sie möchten, eineList<IFruit>
würden Sie haben, um eine neue Liste. Zum Beispiel:Aber das ist nicht das gleiche wie casting-der original-Liste - da sind jetzt zwei separate Listen. Das ist sicher, aber Sie müssen verstehen, dass änderungen an einer Liste nicht gesehen werden, die in der anderen Liste. (Änderungen an der Objekte, dass die Listen beziehen zu sehen sein wird, natürlich.)
wie sind Sie "noch im Aufbau"!
Was ist der Unterschied zwischen der Kovarianz tolist und dabei neue Liste<IFruit>(); dann ein foreach über die original-Liste und das hinzufügen jedes Element in der IFruit-Liste? In der foreach Weg... das Objekt-Referenz wäre das gleiche, richtig? Also... wenn das wahr ist, macht es wenig Sinn für mich persönlich, dass man nicht einfach direkt cast die ganze Liste. ?
Was meinst du mit "Objekt-Referenz"? Die Objekt Referenz jedes element ist die gleichen, aber das ist nicht das gleiche wie das Gießen der Liste auf sich selbst. Angenommen, Sie könnten cast der Referenz, so dass Sie hatte eine Referenz von compile-time-Typ
List<IFruit>
das war eigentlich ein Verweis auf eineList<Apple>
. Was würde Sie erwarten, wenn Sie einenBanana
Verweis auf dasList<IFruit>
?Ich habe keine Ahnung, was beliebiger dein code aussieht, oder ob Sie eine
using
Richtlinie fürSystem.Linq
oder, was Sie versuchen, rufen Sie es auf, ich bin mir nicht sicher, wie Sie erwarten, dass ich in der Lage sein zu helfen. Ich schlage vor, Sie tun mehr Forschung, und wenn Sie noch fest sind, Sie bitten, eine Frage mit einer minimale reproduzierbare Beispiel.InformationsquelleAutor Jon Skeet
Einem Guss iterator und .ToList():
List<IDic> casted = input.Cast<IDic>().ToList()
wird den trick tun.Ursprünglich sagte ich Kovarianz funktionieren würde - aber als Jon hat zu Recht darauf hingewiesen -; Nein, es wird nicht!
Und ursprünglich hatte ich auch blöderweise aufgehört die
ToList()
nennenCast
gibt einIEnumerable<T>
, nicht einList<T>
- und Nein, Kovarianz nicht ermöglichen, diese Konvertierung, da wäre es nicht sicher - siehe meine Antwort.Von der Seite, die du verlinkt: "Nur interface-Typen und delegate-Typen können Parameter vom Typ variant ein"
Würd ich merkte, dass die
ToList()
fehlte vor dem Lesen Ihren Kommentar, aber ja, wie du gezeigt hast natürlich Kovarianz wird nicht funktionieren! Doh!Recht. Kovarianz noch helfen können, da es bedeutet, Sie brauchen nicht die
Cast
rufen kann .NET 4, so lange wie Sie angeben, welche Art argument zuToList
.InformationsquelleAutor Andras Zoltan
Ich hatte auch dieses problem und nach der Lektüre von Jon Skeet ist die Antwort, die ich meine modifizierten Codes
List<T>
zu verwendenIEnumerable<T>
. Dies ist zwar keine Antwort auf die OP ' s ursprüngliche Frage von Wie kann ich warfList<Client>
zuList<IDic>
, es tut vermeiden die Notwendigkeit, dies zu tun und kann somit hilfreich sein, um andere, die dieses Problem Auftritt. Dies ist natürlich davon ausgegangen, dass der code, der erfordert die Verwendung vonList<IDic>
unter Ihrer Kontrolle.E. g.:
Statt:
InformationsquelleAutor Ɖiamond ǤeezeƦ
Wenn Sie können, verwenden Sie LINQ, können Sie dies tun...
InformationsquelleAutor musefan
InformationsquelleAutor Marc Messing
Ist es nur möglich, durch die Schaffung neuer
List<IDic>
und die übertragung aller Elemente.Meine Vermutung wäre, du hast downvoted weil Sie gesagt haben, war es nur möglich, erstellen Sie eine neue Liste, aber andere haben geschrieben, um das Gegenteil... nicht mein downvote, wenn)
Gut tun Sie neue Listen erstellen, aber nicht mit dem neuen Betreiber, der sich nicht ändert Tatsache, dass Sie tun.
Ja, ich nehme an, Sie tun
InformationsquelleAutor Piotr Auguscik
In .Net 3.5, können Sie Folgendes tun:
Konstruktor für Liste in diesem Fall dauert ein IEnumerable.
Liste ist jedoch nur Cabrio Typ IEnumerable. Obwohl myObj kann konvertierbar sein, um ISomeInterface den Typ IEnumerable ist, nicht Cabrio Typ IEnumerable.
InformationsquelleAutor Kent Aguilar