Das hört sich vielleicht wirklich dumm an. aber ich habe ein seltsames Problem mit der D-Programmiersprache. Wenn ich versuche, ein neues Array wie folgt zu erstellen:
%Vor%Der DMD-Compiler gibt mir immer diesen Fehler:
test.d (5): Fehler: Kann nicht implizit den Ausdruck ("Wert") des Typs konvertieren invariant (char [5u]) zu char []
Irgendeine Idee warum? Ich benutze das 2.014 alpha (verfügbar hier ) für Ubuntu.
Im Grunde geht es darum, dass String-Literale in einem schreibgeschützten Teil des Speichers gespeichert werden. char[]
ist "ein veränderbares Array von veränderbaren Zeichen" , das, falls geschrieben, einen Laufzeit-Crash erzeugen würde.
Der Compiler versucht also wirklich, Sie hier zu schützen.
invariant(char)[]
bedeutet "ein veränderbares Array invarianter Zeichen" , was genau das ist.
PS : Wenn Sie nicht als char[]
verwenden möchten, können Sie auto
verwenden, wie in auto variable = "value"
. Es befreit dich davon, über seinen Typ nachzudenken:)
Es gibt zwei Hauptversionen der D-Sprache. Sie sind im Allgemeinen gegenseitig inkompatibel, obwohl Code in beide kompiliert werden kann.
D1 ist, was der von Ihnen mitgelieferte Code zu sein scheint. Es hat kein Konzept von unveränderlichen Arrays, daher funktioniert das.
D2 ist, was Sie versuchen, es zu kompilieren, daher die 2 die Compiler-Versionsnummer beginnt. Eines der wichtigsten D2-spezifischen Merkmale ist dieses Konzept von const und unveränderlichen / invarianten Datenreferenzen.
%Vor% String-Literale in D2 werden als unveränderliche Daten klassifiziert und können daher keinem char [] zugeordnet werden, sondern nur einem const(char)[]
oder invariant(char)[]
(oder wchar oder dchar Äquivalenten).
string
ist ein Alias von invariant(char)[]
, den Sie entweder zur Vereinfachung oder zur D1-Kompatibilität verwenden möchten.