Die mehrfache Verwendung des Array-Initialisierers '{}' für die gleiche Variable wird nicht kompiliert

8

Ich versuche, folgenden Code in C # zu kompilieren:

%Vor%

Und ich bekomme Kompilierungsfehler wie:

%Vor%

Auf der anderen Seite, wenn ich es versuche

%Vor%

Es kompiliert gut. Gemäß MSDN ,

%Vor%

ist einfach eine Abkürzung für einen äquivalenten Array-Erstellungsausdruck:

%Vor%

Warum kompiliert das erste Codebeispiel nicht?

    
Babar 04.08.2010, 14:41
quelle

7 Antworten

5

C # spec 12.6 Arrayinitialisierer

  

In einer Feld- oder Variablendeklaration ist der Array-Typ der Typ des Felds oder der Variablen, die deklariert werden. Wenn ein Array-Initialisierer in einer Feld- oder Variablendeklaration verwendet wird, z.   int [] a = {0, 2, 4, 6, 8};   Es ist einfach eine Abkürzung für einen äquivalenten Array-Erstellungsausdruck:   int [] a = neuer int [] {0, 2, 4, 6, 8};

%Vor%

ist eine Deklaration aber

%Vor%

ist nicht.

    
desco 04.08.2010, 14:47
quelle
9

Korrekt, die kurze Initialisierungssyntax ist nur in einer Deklaration erlaubt. Nicht in einer normalen Aussage.

%Vor%

Die Kurzzeiger-Notation ist nur erlaubt, wenn sie als (rhs) Teil einer Deklaration verwendet wird.

    
Henk Holterman 04.08.2010 14:45
quelle
2

Wie bei derselben MSDN-Seite ist diese Syntax spezifisch für die Initialisierung von Arrayvariablen. Es ist keine allgemeine Array-Syntax.

Dies ist jedoch nahe:

%Vor%     
Tim Robinson 04.08.2010 14:46
quelle
2

Der Compilerfehler, auf den Sie verweisen, wird durch die inaild Syntax verursacht.

%Vor%     
Matthew Whited 04.08.2010 14:47
quelle
1

Gemäß den Dokumenten, mit denen Sie verbunden sind, sind Array-Initialisierer nur in Feld- oder Variablendeklarationen gültig - für Variablenzuweisungen müssen Sie new[] vorher angeben:

  

In einem Array-Erstellungsausdruck (der allgemeine Fall) steht der Array-Typ unmittelbar vor dem Initialisierer. In einem Feld oder einer Variablendeklaration ist der Array-Typ der Typ des Felds oder der Variablen, die deklariert werden.

    
thecoop 04.08.2010 14:46
quelle
1

Array-Initialisierer, die als Teil von Variablendeklarationen verwendet werden, sind im Grunde genommen speziell. (Ich kann den Spezifikationsverweis jetzt nicht nachschlagen, aber ich kann es später tun.) Außerhalb einer Variablendeklaration nimmt der Compiler nicht wirklich viel Notiz von der Tatsache, dass es eine Zuweisung gibt - der Ausdruck auf der rechten Seite Seite muss sozusagen auf eigenen Füßen stehen. 1

In C # 3 können Sie eine leicht abgekürzte Form verwenden:

%Vor%

Dies wird den Typ des Arrays (zur Kompilierzeit) von den Elementen in ihm ableiten ... und unter der Annahme, dass es mit der Zielvariablen kompatibel ist, wird die Zuweisung funktionieren. Diese Syntax funktioniert in einem allgemeineren Kontext - Sie können damit beispielsweise Arrays als Methodenargumente übergeben.

Es gibt jedoch keine Möglichkeit, das "vollständig abgekürzte" Formular außerhalb von Variablendeklarationen zu verwenden.

1 Zugegebenermaßen gibt es einige Ausdrücke, die keinen Typ haben, wie Lambda-Ausdrücke.

    
Jon Skeet 04.08.2010 14:48
quelle
0

Während der Initialisierung deklarieren Sie explizit den Typ des Arrays, wodurch diese Kurzschrift klar und eindeutig wird. Später, im Code, beginnt sich jedoch eine kleine Mehrdeutigkeit einzuschleichen. Sie könnten theoretisch versuchen, eine Anordnung von Objekten zu erstellen. Sicher, Sie wahrscheinlich wollen, dass es ein Array von Strings ist, aber um logische Fehler zu vermeiden, möchte der Compiler nicht so etwas annehmen, es sei denn, es ist extrem klar, was Sie versuchen mach das.

    
Justin Morgan 04.08.2010 14:57
quelle

Tags und Links