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?
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?
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.
+1, Najlepszy cytat z linku _ „ty nie faktycznie dokonać typ elementu do tablicy tego typu przez nadanie specyfikator tablicy.” _ – ja72
@ 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. –
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
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.
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 [,]' . –
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. Fajne pytanie! – ja72
@ SonerGönül: Spróbuj '[] [,] [,,] [,,,] [,,,,,] - teraz jest jasne, co się dzieje? –