2012-01-29 10 views
6

Nie mogę znaleźć żadnej dokumentacji na temat tego, co nowe [] ma być. Od Poniższy przykład wydaje się być tablicą obiekt skrótowymCo to jest nowy [] skrót?

var json = new[] { 
      new object[] {"20-Jun-2008", 200 }, 
      new object[] {"20-Jun-2009", 250 } 
     }; 
+0

Nie możesz po prostu sprawdzić typu "jsona", aby zobaczyć, co powraca? –

Odpowiedz

21

Są to niejawnie wpisane tablice.

Zobacz C# 3.0 specifications.

Składnia wyrażeń tworzenia array (§7.5.10.2) zostaje przedłużony do wsparcia niejawnie wpisywanych wyrażeń tworzenia tablicy: array-Creation-wyrażenie: ... new [ ] array-initializer

W niejawnie wpisywanych tworzenia macierzy wyrażenie, typ instancji tablicy jest wywnioskowany z elementów określonych w inicjatorze tablicy . W szczególności zestaw utworzony przez typy wyrażeń w inicjatorze macierzy musi zawierać dokładnie jeden typ do , w którym każdy typ w zestawie jest niejawnie wymienialny, a jeśli ten typ nie jest typem zerowym, tablica tego typu jest stworzony. Jeśli nie można wywnioskować dokładnie jednego typu: lub jeśli wywnioskowany typ jest typu pustego, pojawia się błąd kompilacji .

Poniżej przedstawiono przykłady niejawnie wpisywanych stworzenie tablicy wyrażeń:

var a = new[] { 1, 10, 100, 1000 };   // int[] 
var b = new[] { 1, 1.5, 2, 2.5 };   // double[] 
var c = new[] { "hello", null, "world" };  // string[] 
var d = new[] { 1, "one", 2, "two" };   // Error 

ostatniego wyrażenia powoduje błąd kompilacji, ponieważ ani int ani ciąg jest niejawnie zamienny do drugiego. W tym przypadku należy użyć jawnie wpisanego wyrażenia kreującego tablicę , na przykład określając typ obiektu []. Alternatywnie, jeden z elementów może zostać odlany do wspólnego typu podstawowego, który następnie stałby się domniemanym typem elementu .

Wyrażenia jawnie tworzone przez tablicę można łączyć z anonimowymi inicjalizatorami obiektów w celu utworzenia anonimowo wpisanych danych o strukturach . Np

var contacts = new[] { 
    new { 
     Name = "Chris Smith", 
     PhoneNumbers = new[] { "206-555-0101", "425-882-8080" } 
    }, 
    new { 
     Name = "Bob Harris", 
     PhoneNumbers = new[] { "650-555-0199" } 
    } 
}; 
7

Zapis jest deklaracja implicitly typed array.

W twoim przypadku jest to tablica szeregów obiektów.

+0

Jak to jest anonimowe, czy nie jest zmienną 'json' typu: object [] []'? – dillenmeister

+0

@dillenmeister - Uczciwy punkt. Rzeczywiście nie ma anonimowych typów. – Oded

1

Oznacza to, że nowy [] jest niejawnie wpisane tablicy. Ponieważ jest on niejawnie wpisany, musisz przypisać do niego coś jak w tym przykładzie. Podobnie jak w przypadku słowa kluczowego var.

1

To niejawne pisanie. Ponieważ wszystkie elementy w tej kolekcji to tablice object, kompilator może wywnioskować, że sama tablica musi być zbiorem tablic object.