Systemeigenen Typ in generischen Liste verwenden
-
Hallo!
Gibt es irgendeine Möglichkeit diesen Code zum Laufen zu bringen? :
List<PointF^> ^test = gcnew List(3); //Compilerfehler C3225 for(int i=0; i < test->Capacity; i++) test->Add(gcnew PointF(i,i+1));
Das Problem ist, dass für das generische Typargument T kein systemeigener Typ verwendet werden kann
Die Alternative unter Verwendung einer ArrayList hat den Nachteil, dass beim Einfügen und Auslesen die Elemente nach / bzw. von Objekt gecastet werden
Edit:
Zum Compilerfehler C3225 siehe auch hier: http://msdn.microsoft.com/de-de/library/7ka8tbxh.aspx
-
Guck mal in die FAQ
-
Meinst du diesen Beitrag? :
Howto:gcroot<T^> - Managed Klassen in Unmanaged Klassen verwenden
-
Du musst den korrektne Typ angeben (bei gcnew).
// SO: List<PointF^> ^test = gcnew List<PointF^>(3); // NICHT SO: List<PointF^> ^test = gcnew List(3);
Simon
-
Danke für den Tipp.
Das Problem bleibt
:
error C3225: Das generische Typargument für "T" kann nicht "System::Drawing::PointF ^" sein, es muss ein Werttyp oder ein Handle für einen Referenztyp sein.
-
Mein Fehler. Hatte übersehen, dass PointF ein ValueType ist:
List<PointF> ^test = gcnew List<PointF>(3);
Simon
-
Das klappt!
Nur ist eine ArrayList in der Referenzen auf PointF Objekte abgelegt sind - trotz hin und her casten - deutlich performanter als die Variante mit Liste und ObjektenNaja, macht nichts. Dann bleibts halt bei dieser Variante:
ArrayList ^test = gcnew ArrayList(3); for(int i=0; i < test->Capacity; i++) test->Add(gcnew PointF(i,i+1));
-
Schau Dir mal das Thema Boxing und Unboxing an.
Nur ist eine ArrayList in der Referenzen auf PointF Objekte abgelegt sind - trotz hin und her casten - deutlich performanter als die Variante mit Liste und Objekten
Immer erst den Profiler befragen.