Warum kann ich kein implizit typisiertes Array ohne Initialisierer deklarieren?

8

Warum muss ich int nach new schreiben, wenn ich das Array num ohne Initialisierer deklariere? ZB

%Vor%

Für ein anderes Array, num1, Ich habe es zuerst deklariert und dann gab es Werte, und ich habe nicht int nach new eingegeben wie für das Array num .

%Vor%

Warum funktioniert diese Verknüpfung nicht für mein erstes Beispiel?

    
elseshawe 28.09.2017, 15:28
quelle

5 Antworten

9

Der Typ des Arrays kann (unter bestimmten Umständen, die Ihr Beispiel erfüllt) abgeleitet werden, wenn Sie die Werte für das Array angeben. Da die Werte alle Ganzzahlen sind, kann der Compiler daraus schließen, dass Sie ein Array mit ganzen Zahlen haben möchten. Wenn Sie keine Werte angeben (oder wenn die Werte nicht alle implizit in den Typ eines der Werte konvertiert werden können), kann nicht bestimmt werden, was der Typ des Arrays sein soll, und Sie müssen dies angeben es explizit.

    
Servy 28.09.2017, 15:36
quelle
7

Die "vollständige" Syntax zum Deklarieren eines Arrays mit Werten ist new int[] {1, 2, 3, 4}; .

Ihre new [] {1, 2, 3, 4}; -Zeile ist eine Kurzschriftsyntax. Es ist ein "implizit typisiertes" Array. Da die Werte alle int sind, wird das Array automatisch als int[] deklariert.

Der Grund, warum Sie nicht auch int[] x = new [5]; schreiben können, ist einfach, dass diese Funktion von den C # -Designern nicht implementiert wurde.

    
Blorgbeard 28.09.2017 15:40
quelle
3

Weil Sie zu erwarten scheinen, dass die Art, wie der Compiler den Typ des Arrays ableitet, irgendwie auf dem Typ links vom Zuweisungsoperator basiert:

%Vor%

Dein Denkprozess ist:

  1. num ist ein Array von int s.
  2. new[5] ist ein Array von etwas.
  3. etwas muss int sein, weil das der Typ num ist.

So funktioniert der Compiler nicht. Der Compiler muss den Typ rechts vom Zuweisungsausdruck eindeutig herausfinden und einmal prüfen, ob die Zuweisung zu dem, was auf der linken Seite steht, gültig ist.

In den Syntaxen, die in C # erlaubt sind, hat der Compiler immer genügend Informationen, um den Typ auf der rechten Seite der Zuweisung herauszufinden (falls es einen hat). Ihre vorgeschlagene Syntax würde diese Information nicht bereitstellen.

    
InBetween 28.09.2017 16:11
quelle
2

In Ihrem ersten Szenario deklarieren Sie ein leeres Array, also müssen Sie bestimmen, um welchen Typ es sich handelt.

%Vor%

In Ihrem zweiten Beispiel wird jedoch der Typ des Arrays basierend auf den Werten angegeben, die Sie den Slots im Array zuweisen.

%Vor%

Das obige funktioniert, weil jedes Element im Array vom selben Typ ist.

Wenn Sie Folgendes tun würden, würde ein Kompilierungsfehler auftreten, weil der Typ nicht abgeleitet werden kann, da die Elemente unterschiedliche Typen sind.

%Vor%

Wenn Sie jedoch eines der Elemente als gemeinsamen Basistyp deklarieren, werden alle Elemente als Basistyp gespeichert.

%Vor%     
krillgar 28.09.2017 15:38
quelle
0
  

warum ich Int nach new schreiben muss, wenn ich die Array-Nummer mit Standardwerten deklariere

Sie nicht. Es gibt eine Reihe von Shorthands, weil oft der Compiler den Typ des Arrays, das Sie erstellen, ableiten kann, wie in Ihrem Fall.

Das ist also eine vollkommen schöne Erklärung:

%Vor%

Sehen Sie, hier ist kein int , aber wenn Sie den Mauszeiger über var halten, wird Ihnen mitgeteilt, dass das Array ein int[] ist.

Es wird schwieriger, wenn Sie Typen mischen:

%Vor%

Dann weiß der Compiler nichts und zwingt Sie, einen Typ anzugeben.

    
Patrick Hofman 28.09.2017 15:38
quelle

Tags und Links