Warum muss ich int
nach new
schreiben, wenn ich das Array num
ohne Initialisierer deklariere? ZB
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
.
Warum funktioniert diese Verknüpfung nicht für mein erstes Beispiel?
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.
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.
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:
num
ist ein Array von int
s. new[5]
ist ein Array von etwas. 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.
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%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.