2013-02-14 14 views
23

Ocenianie typeof(Object[,][]).Name daje Object[][,]Dlaczego typof (Object [,] []). Nazwa jest równa "Object [] [,]"?

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

Wydaje się przecinek przesuwa się bez powodu.

Co daje?

+0

znajdę zasady zmieniając położenie przecinka, ale nie wiem, dlaczego to działa tak. Przecinek odbijający się od środka tablicy. Na przykład; '[,] [] [] [] []' daje '[] [] [] [] [,]', '[] [,] [] [] []' daje ci '[] [] [ ] [,] [] ',' [] [] [,] [] [] 'daje w rezultacie' [] [] [,] [] [] '. –

+1

+1. Fajne pytanie! – ja72

+2

@ SonerGönül: Spróbuj '[] [,] [,,] [,,,] [,,,,,] - teraz jest jasne, co się dzieje? –

Odpowiedz

19

Mieszanie poszarpane prostokątnych tablic recepta dla obłęd. Twoja intuicja odnośnie tego, co oznacza dany typ zapisu, jest prawie zawsze błędna, a przynajmniej moja.

przeczytać mój artykuł na ten temat i sprawdzić, czy to pomaga zrozumieć, co się dzieje tutaj:

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

Zasadniczo: C# i refleksji zapisywać mieszane poszarpane/prostokątne tablice na dwa różne sposoby, każdy dla z własnych powodów.

+0

+1, Najlepszy cytat z linku _ „ty nie faktycznie dokonać typ elementu do tablicy tego typu przez nadanie specyfikator tablicy.” _ – ja72

+0

@ ja72: Zgadza się, w C#, że jest to przypadek. Ale w Reflection, który nie przestrzega reguł C#, po prostu przykleja modyfikator tablicy do końca nazwy typu, a nie do środka. –

+0

Dzięki za odpowiedź Eric. Nie martw się - właściwie nie używam tego typu w moim kodzie. Piszę narzędzie, które tworzy przyjazną listę publicznych API za pomocą odbicia, a ten przypadek testowy zadzwonił dzwonek alarmowy. – RobSiklos

3

Pomijając cel, dla którego warto zadeklarować taką egzotyczną tablicę, wygląda na to sposób odbicie produkuje nazwa tablicy jest rekurencyjna: po pierwsze, produkuje nazwę typu elementu tablicy, a następnie dołącza kwadratowy nawiasy z odpowiednią liczbą przecinków.

Object[,][] jest tablicą 2D tablic 1D; typ elementu tablicy 2D to Object[], więc ogólny wynik to "Object[]"+"[,]".

Oto kolejna ilustracja sposób algorytm działa:

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

jest

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

Nie widzę powodu, za nim inne niż sprawność realizacji: tak długo, jak jest spójny, nie ma znaczenia, czy składnia pasuje do C# czy nie. W końcu C# nie jest jedynym językiem w świecie .NET.

+1

Prawidłowo; dziwność jest taka, że ​​C# mówi, że 'object [,] []' jest tablicą dwóch obiektów 'object []', kiedy naiwnie wygląda, jakby to był jeden-d tablica 'object [,]' . –

Powiązane problemy