2010-08-18 5 views
7

Ich habe Probleme zu verstehen, warum Arrays in C# kovariant sind und welche Vorteile diese Kovarianz haben kann. Betrachten Sie das folgende triviale Codebeispiel:Warum sind C# -Arrays kovariant und welche Vorteile bringt es?

object[] myArray = new string[1]; 
myArray[0] = 1; 

Dieser Code wird in Ordnung kompilieren, aber ohne Umstände und vielleicht wenig überraschend zur Laufzeit explodieren.

Wenn ich versuche, dasselbe mit Generics zu versuchen, würde der Compiler mich angrinsen und ich würde meine Dummheit in einem frühen Stadium erkennen, also meine Frage ist: Warum erlaubt der C# -Compiler diese Kovarianz mit Arrays und darüber hinaus Was sind die potenziellen Vorteile?

Antwort

12

Eric Lippert sagt:

U Leider ist diese besondere Art der Kovarianz gebrochen. Es wurde der CLR hinzugefügt, weil Java dies erfordert und die CLR-Designer Java-ähnliche Sprachen unterstützen wollten. Wir haben es dann hochgefahren und zu C# hinzugefügt, weil es in der CLR war. Diese Entscheidung war zu dieser Zeit ziemlich umstritten und ich bin nicht sehr glücklich darüber, aber wir können jetzt nichts dagegen tun.

4
+3

mquander gewinnt, weil er den Blog zitiert, anstatt nur darauf zu verlinken. –

+1

@ Jon B - und zum Zitieren der _relevant_ Bit. – Oded

+0

Danke für die Links zu weiteren Informationen. Sehr hilfreich. – nukefusion

1

Es gibt viele Situationen, in denen Code Elemente zwischen den Steckplätzen eines Arrays verschiebt oder kopiert. Vorausgesetzt, dass Arr ein eindimensionales Array mit mindestens zwei Elementen ist, funktioniert der folgende Code unabhängig vom Typ Arr oder den darin enthaltenen Elementen.

Object temp = Arr[1]; 
Arr[1] = Arr[0]; 
Arr[0] = temp; 

Dieser Code wird ineffizient sein, wenn Arr ein Werttyp ist, aber da temp aus dem Array, die Art des Arrays gelesen wird garantiert halten einen solchen Wert der Lage sein. Der Code muss Elemente vom Typ value-type ein- und auspacken und ist daher bei solchen Typen ineffizient, funktioniert aber trotzdem.

Beachten Sie, dass beim Erstellen von Arrays kovariant eine Möglichkeit ist, Dinge wie das Sortieren von Methoden auf beliebigen Array-Typen zu ermöglichen, aber es ist nicht die einzige Methode. Ein anderer Ansatz wäre, dass System.Array einige Methoden und Eigenschaften enthält, deren Parameter keine Beziehung zum zugrunde liegenden Elementtyp haben. Zum Beispiel könnte es einige einfache Methoden wie Swap, CopyItem und Roll und möglicherweise Methoden zur Durchführung komplexer Permutationen mit einer Liste von Indizes enthalten. Beachten Sie, dass im Gegensatz zum oben gezeigten Code ein Typ wie Int[] sein Swap-Verfahren in einer solchen Weise überschreiben könnte, dass Boxen und Unboxing vermieden werden.

Verwandte Themen