2013-02-14 10 views
23

typeof(Object[,][]).Name Auswertung gibt Object[][,]Warum ist typeof (Objekt [,] []). Name gleich "Objekt [] [,]"?

Ähnlich typeof(Object[][,]).Name gibt Object[,][]

Scheint, wie das Komma ohne Grund bewegt.

Was gibt?

+0

Ich finde die Regel der Position des Komma ändern, aber ich weiß nicht, warum es so verhält. Komma, das zum Zentrum der Anordnung reflektiert. Beispielsweise; '[,] [] [] [] []' gibt dir '[] [] [] [] [,]', '[] [,] [] [] []' gibt dir '[] [] [ ] [,] [] ',' [] [] [,] [] [] 'ergibt als Ergebnis" [] [] [,] [] [] ". –

+1

+1. Gute Frage! – ja72

+2

@ SonerGönül: Probiere '[] [,] [,,] [,,,] [,,,,,]' - jetzt ist klar, was vor sich geht? –

Antwort

19

Das Mischen zerklüfteter und rechteckiger Arrays ist ein Rezept für Wahnsinn. Deine Intuition darüber, was eine bestimmte Schreibweise bedeutet, ist fast immer falsch, oder zumindest meine.

Lesen Sie meinen Artikel über das Thema und sehen, ob das hilft zu verstehen, was hier vor sich geht:

http://blogs.msdn.com/b/ericlippert/archive/2009/08/17/arrays-of-arrays.aspx

Grundsätzlich gilt: C# und Reflexion notate gemischte zerlumpten/rechteckigen Anordnungen auf zwei verschiedene Arten, die jeweils für ihre eigenen Gründe.

+0

+1, Bestes Zitat aus dem Link _ "Sie machen keinen Elementtyp in ein Array dieses Typs, indem Sie einen Array-Spezifizierer anhängen." _ – ja72

+0

@ ja72: Richtig, in C# ist das der Fall. Aber in Reflection, das nicht den Regeln von C# folgt, klebt es einfach den Array-Modifikator am Ende des Typnamens, nicht in der Mitte. –

+0

Danke für deine Antwort Eric. Mach dir keine Sorgen - ich benutze keine Typen wie diese in meinem Code. Ich schreibe ein Tool, das mithilfe von Reflektion eine benutzerfreundliche Liste öffentlicher APIs erstellt, und dieser Testfall hat eine Alarmglocke ausgelöst. – RobSiklos

3

Abgesehen von dem Zweck, für den Sie ein solches exotisches Array deklarieren möchten, sieht die Art und Weise aus, wie die Reflektion den Namen eines Arrays erzeugt, rekursiv: Zuerst wird der Name des Array-Elementtyps erzeugt und dann das Quadrat angehängt Klammern mit der entsprechenden Anzahl von Kommas.

Object[,][] ist ein 2D-Array von 1D-Arrays; Der Elementtyp des 2D-Arrays ist Object[], daher lautet das Gesamtergebnis "Object[]"+"[,]".

Hier ist ein weiteres Beispiel dafür, wie der Algorithmus funktioniert:

typeof(Object[][,][,,][,,,][,,,,]).Name 

ist

Object[,,,,][,,,][,,][,][] 

Ich habe keinen Grund dahinter andere als die Effizienz der Umsetzung sehen: da es so lange ist konsistent, es spielt keine Rolle, ob die Syntax mit C# übereinstimmt oder nicht. Schließlich ist C# nicht die einzige Sprache im .NET-Universum.

+1

Korrekt; Die Besonderheit ist hier, dass C# sagt, dass 'object [,] []' ein zwei-d-Array von 'object []' ist, wenn es naiv aussieht, als sollte es ein Ein-D-Array von 'object [,]' sein . –

Verwandte Themen