2016-04-07 15 views
2

Es dumm aussehen könnte, aber ich frage mich, warum der folgende Code erzeugt mich CS0106 Kompilierzeitfehler:CS0106 kompilieren Fehler: Nur-Lese-Eigenschaft und Getter

error CS0106: The modifier 'readonly' is not valid for this item

Der Code:

class MyClass 
{ 
private readonly int _value 
{ 
    get 
    { 
    if (_value < 0) 
     return -1 * _value; 
    return _value; 
    } 
} 

In meinem Verständnis mache ich nichts falsch in get, wie ich gerade den Wert gelesen habe. Ich stimme zu, dass Berechnungen für readonly 's Eigenschaft Getter aus logischer Sicht ungeschickt aussehen.

P.S. Code innerhalb get hat keinen praktischen Sinn - es ist nur ein „etwas, das dem _value liest“

Kurz

UPDATE zunächst dachte ich, dass es ziemlich logisch wäre, durch die Verwendung readonly Schlüsselwort eine Nur-Lese-Eigenschaft zu machen . vermisste ich die Hauptsache über readonly Eigenschaft, die von der Microsoft-Dokumentation zur Verfügung:

The readonly keyword is a modifier that you can use on fields.

+0

die Get-only-Eigenschaft ist bereits wie readonly Sache. Wie auch immer, das Schlüsselwort readonly ist für Felder und nicht für Eigenschaften –

+4

Auch wenn Sie den 'readonly' Teil korrigieren, ist Ihre Eigenschaft jetzt rekursiv. Sie müssen auch ein separates Feld angeben. – vcsjones

+0

Warum möchten Sie Readonly auf eine Property setzen? – Default

Antwort

5

Kein Sarkasmus ... Sie einen Compiler-Fehler erhalten, weil es für die Sprache nicht Teil der Grammatik ist.

Erstens, von Natur aus mit nur einem get, dann machen Sie bereits die Eigenschaft "readonly".

Zweitens müssen Sie sich die Eigenschaft als syntaktischen Zucker um zwei Methoden int getValue() und void setValue (int) vorstellen. Wäre es sinnvoll, die Methoden als "readonly" zu setzen?

Drittens würde das Festlegen der Eigenschaft als schreibgeschützt keinen Sinn ergeben, da die Eigenschaft als Konstrukt keinem Speicher zugeordnet ist. Sehen Sie den vorherigen Punkt darüber, wie es im Prinzip eine schöne Art ist, zwei Methoden zu schreiben.

+0

Danke Babak. Sieht so aus, als ob ich die Dokumentation sorgfältiger lese. Dort steht: "Das Schlüsselwort readonly ist ein Modifikator, den Sie für Felder * verwenden können."Was ich dachte, ich sollte erhalten, ist eine Eigenschaft ohne Setter und ich habe erwartet, dass ich Standard-Getter wie ich will überschreiben, bis ich nicht auf den' _value schreiben. Es sah logisch zu mir :) – DaddyM

1

Implementieren nur Get für eine Eigenschaft ist wie bereits Readonly. Wenn Sie also das ähnliche Verhalten implementieren möchten, wird unten der Arbeitscode sein.

class MyClass 
{ 
    private readonly int _value = -5; // < some value> or<set it in the constructor>; 
    private int ReadableValue 
    { 
     get 
     { 
      return Math.Abs(_value); 
     } 
    } 
} 
+0

Danke Abhilash. Ich habe mit der Sprache in Lernzwecken gespielt. Ich war nur neugierig - konnte ich readonly Eigenschaft mit "readonly" Schlüsselwort erreichen. Dann schaute ich in die Dokumentation aufmerksamer. Es sagt deutlich: "Das readonly Schlüsselwort ist ein Modifizierer, den Sie verwenden können auf ** Felder **. " – DaddyM

+1

Oder verwenden Sie' Math.Abs', die Ihre Absicht deutlicher angibt – Default

+0

Ja, Sie haben Recht –