Warum kann ich ein Objekt (das wirklich Objekt [] ist) nicht in String [] umwandeln?

8

Ich habe ein Feld vom Typ 'Objekt'. Wenn ich es im Watch-Fenster von Visual Studio betrachte, sehe ich sein Objekt [] und wenn ich in die Elemente bohre, sehe ich, dass jedes Element eine Zeichenkette ist.

Aber wenn ich versuche, dies auf einen String [] zu werfen, erhalte ich folgende Fehlermeldung:

  

Kann 'MyObject' (mit einem tatsächlichen Typ von 'object []') nicht in 'string []' string []

umwandeln

Irgendein Grund, warum ich diese Besetzung nicht machen kann? Was ist der beste Weg, um dieses Objekt in ein String-Array zu konvertieren?

    
leora 13.04.2012, 14:07
quelle

6 Antworten

16
%Vor%

- BEARBEITEN -

seit du gesagt hast Ich habe ein object (wissend, dass es tatsächlich ein object[] ist)

%Vor%     
L.B 13.04.2012, 14:10
quelle
23

Dies ist eine besonders verwirrende Funktion von C #. Das ist der Deal.

In dieser Diskussion nehmen wir an, dass der Elementtyp eines Arrays ein Referenztyp und kein Werttyp ist.

C # unterstützt unsichere Array-Kovarianz . Das bedeutet, dass Sie, wenn Sie ein Array von Zeichenfolgen haben, dieses in ein Array von Objekten konvertieren können, da eine Zeichenfolge in ein Objekt konvertiert werden kann:

%Vor%

Wenn Sie dann versuchen, ein Element aus a2 zu entfernen, funktioniert es:

%Vor%

Das ist legal, weil a2[0] wirklich a1[0] ist, was eine Zeichenfolge ist, die in ein Objekt umgewandelt werden kann.

Wenn Sie jedoch versuchen, write in das Array zu schreiben, erhalten Sie einen Fehler zur Laufzeit :

%Vor%

Dies schlägt zur Laufzeit fehl, weil a2 wirklich ein Array von Zeichenfolgen ist und Sie keine Nicht-Zeichenfolge in ein Array von Zeichenfolgen einfügen können.

Also C # ist schon schrecklich kaputt; Es ist möglich, ein Programm zu schreiben, das kompiliert und normal aussieht, aber plötzlich mit einer Typausnahme zur Laufzeit abstürzt, weil Sie versucht haben, ein Objekt in ein Array von Objekten zu setzen, das eigentlich kein Array von Objekten ist.

Das gewünschte Feature ist sogar noch mehr kaputt als das , und Gott sei Dank wird es von C # nicht unterstützt. Die gewünschte Funktion ist:

%Vor%

Das wäre unsichere Array Kontravarianz . Es bricht schrecklich so:

%Vor%

Und jetzt haben wir einfach einen Kunden in eine Variable vom Typ string kopiert.

Sie sollten jede Art von Array-Kovarianz oder -Kontravarianz vermeiden; Array-Kontravarianz ist, wie Sie herausgefunden haben, nicht legal, und Array-Kovarianz macht kleine Zeitbomben in Ihrem Programm, die unerwartet ausgehen. Machen Sie Ihre Arrays zunächst mit dem richtigen Typ.

    
Eric Lippert 13.04.2012 14:59
quelle
0
%Vor%

Andere Antworten hier zeigen Ihnen schnellere / kürzere Möglichkeiten der Konvertierung. Ich habe das Ganze so geschrieben, weil es zeigt, was wirklich vor sich geht und was passieren muss. Sie sollten eine der einfacheren Methoden in Ihrem tatsächlichen Produktionscode verwenden.

    
Servy 13.04.2012 14:12
quelle
0

Die Regel bei der objektorientierten Programmierung ist -

"Abgeleitete Klasse kann immer in Basisklasse" AND "typisiert werden "Eine Basisklasse kann nur dann in die abgeleitete Klasse umgewandelt werden, wenn die aktuelle Instanz, für die die Basisklasse deaktiviert ist, tatsächlich die abgeleitete Klasse"

ist

z.B. (A ist Basis und B ist abgeleitet)

%Vor%

illegal: & gt;

%Vor%

Das Gleiche gilt für Objekt- und String-Klassen. Objekt ist Basisklasse und String ist Abgeleitete Klasse.

    
Dhananjay 16.04.2012 04:31
quelle
-1

Sie können das echte string[] in object[] konvertieren.

Dies ist eine Array-Kovarianz

Kann ein klares Beispiel in Verbindung finden.

    
Tigran 13.04.2012 14:12
quelle
-1

Sie sollten jedes Element in die Sammlung und nicht die Sammlung selbst umsetzen.

%Vor%     
Philip Fourie 13.04.2012 14:12
quelle

Tags und Links