2012-03-31 3 views
19

Ich versuche ein 2D-Array zu erstellen, um einige Werte zu speichern, die sich nicht ändern.Ein const-Feld eines anderen Referenztyps als string kann nur mit Null initialisiert werden Fehler

const int[,] hiveIndices = new int[,] { 
{200,362},{250,370},{213,410} , 
{400,330} , {380,282} , {437, 295} , 
{325, 405} , {379,413} ,{343,453} , 
{450,382},{510,395},{468,430} , 
{585,330} , {645,340} , {603,375} 
}; 

Aber beim Kompilieren ich diesen Fehler

hiveIndices is of type 'int[*,*]'. 
A const field of a reference type other than string can only be initialized with null. 

Wenn ich const to static ändern, kompiliert. Ich verstehe nicht, wie das Hinzufügen des Const-Quantors dieses Verhalten auslösen sollte.

Antwort

43

Eigentlich versuchen Sie die Array zu machen - das ist ein Referenztyp ist - const - das wäre nicht beeinflussen Wandelbarkeit seiner Werte bei allen (Sie noch einen beliebigen Wert innerhalb des Arrays mutieren kann) - machen das Array readonly würde es kompilieren, aber auch nicht den gewünschten Effekt haben. Konstante Ausdrücke müssen zur Kompilierzeit vollständig ausgewertet werden, daher ist der neue Operator nicht erlaubt.

Sie könnten nach ReadOnlyCollection<T>

werden der Suche nach den entsprechenden Compiler Error CS0134 mehr sehen:

Ein konstanter Ausdruck ist ein Ausdruck, der bei Compile-Zeit vollständig ausgewertet werden kann. Da die einzige Möglichkeit zum Erstellen eines Nicht-Null-Werts eines Referenztyps die Anwendung des neuen Operators ist und der neue Operator in einem Konstantenausdruck nicht zulässig ist, ist der einzige mögliche Wert für Konstanten von Referenztypen anders als string ist null.

+1

Große Erklärung, danke. – ABH

+0

Um ein readonly 2d-Array zu erstellen, muss man einen Wrapper dafür schreiben, da 'AsReadOnly ' nur eindimensionale, nullbasierte Arrays unterstützt: für mehr Informationen siehe http://stackoverflow.com/questions/5079970/storing-2- dimensional-ints-as-readonly-const-in-separate-class-while-keeping-no – BrokenGlass

+0

du meinst, dass ich down covern habe meine antwort ist nicht die beste? – ABH

Verwandte Themen