なぜこれが実行されないのですか?
class Program
{
static void Main(string[] args)
{
Apple a = new Apple("green");
}
}
class Apple
{
public string Colour{ get; }
public Apple(string colour)
{
this.Colour = colour;
}
}
あなたのコードは、Visual Studio 2015に同梱されているC#6に有効です。ではない以前のバージョンの言語またはVisual Studioに有効です。技術的には、Roslynの古いプレリリースバージョンをVS 2013にインストールすることはできますが、VS 2015がリリースされた今では問題にはなりません。
この問題が発生するには、C#6コードをコンパイルするために間違ったバージョンのVisual Studioを使用しているか、間違った開発環境を使用してコマンドラインからコードをコンパイルしようとしています。おそらく、2015年ではなく「2013年の開発者向けコマンドプロンプト」を開いたのでしょうか。
Visual Studio 2015を使用してコードをコンパイルするか、パス変数が最新のコンパイラを指すようにしてください。
Visual Studio 2013以前を使用する必要がある場合は、古い構文を使用するようにコードを変更する必要があります。
public readonly string _colour;
public string Colour { get {return _colour;}}
public Apple(string colour)
{
_colour=colour;
}
または
public string Colour {get; private set;}
public Apple(string colour)
{
Colour=colour;
}
2番目のオプションは本当に読み取り専用ではないことに注意してください、クラスの他のメンバーはまだプロパティを変更することができます
注意
Visual Studio 2015を使用して.NET 4.5をターゲットにすることができます。言語とランタイム二つの異なることがあります。真の要件は、コンパイラが言語バージョンと一致しなければならないことです
あなたの施設にプライベートセッターを追加してください。
public string Colour{ get; private set;}
あるいは、読み取り専用のバッキングフィールドを追加します。
private string _colour;
public string Colour{ get return this._colour; }
public Apple(string colour)
{
this._colour = colour;
}
{get;}="green"
自動プロパティ初期化子です。 - Panagiotis Kanavos
私はあなたが探しているのはこれだと思います。これはGETを外部の世界に公開するだけで内部変数を保護し続けます。安全性を高めるために、_colourを読み取り専用としてマークして、クラス内で(インスタンス化後に)変更できないようにすることもできますが、やり過ぎると思います。あなたのリンゴが年をとって茶色に変わる必要があるならば、どうですか?
class Program
{
static void Main(string[] args)
{
Apple a = new Apple("green");
}
}
class Apple
{
private string _colour;
public string Colour
{
get
{
return _colour;
}
}
public Apple(string colour)
{
this._colour = colour;
}
}
ここにいくつかの選択肢があります。
// Make the string read only after the constructor has set it
private readonly string colour
public string Colour { get { return colour; } }
public Apple(string colour)
{
this.colour = colour;
}
// Make the string only readonly from outside but editing from within the class
public string Colour { get; private set; }
public Apple(string colour)
{
this.Colour= colour;
}
get; private set;
- dcastro{ get { return colour; } private set; }
動作しませんでした、おそらくコンパイルさえしないでしょう。もしかして{get; private set;}
? - Panagiotis Kanavos
Colour{ get; } = "green"
うまくいくでしょう。これまでのバージョンでは、プライベートセッターを宣言する必要はありません。Colour {get;private set;}
- Panagiotis Kanavos