2

なぜこれが実行されないのですか?

  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;
    }

  }


  • このようにして定義する必要があります。public string Color {get;}プライベートセット;}またはプライベートメンバ_colorを定義して、その値を返すようにgetを残し、コンストラクタで_colorを塗りつぶすことができます。 - Monah
  • これはC#6で動作します。< 6では、auto-propertyはgetアクセサだけを宣言することはできません。 - Chris
  • これをコンパイルするのにどのバージョンのVisual Studioを使用していますか。 2015年にあなたのコードとColour{ get; } = "green"うまくいくでしょう。これまでのバージョンでは、プライベートセッターを宣言する必要はありません。Colour {get;private set;} - Panagiotis Kanavos
  • C#6だけでなく、C#6とマークされていない - AnthonyLambert
  • これを実行するのに4.6は必要ありません、問題なく4.5をターゲットにすることができます。言語とランタイムは、2つの異なるものです。ここで議論しました。実際、私はVS2015を製品コードに使用していますが、しばらくの間4.5をターゲットにしています - Panagiotis Kanavos

4 답변


8

あなたのコードは、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をターゲットにすることができます。言語とランタイム二つの異なることがあります。真の要件は、コンパイラが言語バージョンと一致しなければならないことです


3

あなたの施設にプライベートセッターを追加してください。

public string Colour{ get; private set;}

あるいは、読み取り専用のバッキングフィールドを追加します。

private string _colour;
public string Colour{ get return this._colour; }

public Apple(string colour)
{
  this._colour = colour;
}


  • またはVS 2015でコンパイルしてください。OPの例はC#6のものです - Panagiotis Kanavos
  • これは私にとっては厄介なことではありません。 - HimBromBeere
  • これはC#6の構文です。私はこれを数ヶ月間使用してきました。 2番目の例{get;}="green"自動プロパティ初期化子です。 - Panagiotis Kanavos

2

私はあなたが探しているのはこれだと思います。これは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;
    }

}


  • OPの構文はC#6に有効です。 - Panagiotis Kanavos
  • @PanagiotisKanavosしかし、OPコードは機能しないので(何らかの理由でこれまで言及していなかった)、彼はC#6を使用しないかもしれません。 - HimBromBeere
  • Visual Studio 2015はC#6を使用します。コードOPがC#6を間違っているかどうかは別の問題です。 - Panagiotis Kanavos
  • @PanagiotisKanavosコードはC#6かもしれませんが、実際にはtypeoかそれに似たものがあり、それがOPエラーの原因となります。 OPが教えてくれないのでわかりません。 - HimBromBeere
  • @HimBromBeereタグを追加しました - 間違ったコンパイラを使用しています。そのため、これは有効な質問でもない可能性があります。それは私にとって全く新しいことですが、私はすべての助けに感謝します。 - whytheq

1

ここにいくつかの選択肢があります。

// 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;
}


  • 2番目の提案はコンパイルできませんでした - おそらく、get; private set; - dcastro
  • { get { return colour; } private set; }動作しませんでした、おそらくコンパイルさえしないでしょう。もしかして{get; private set;}? - Panagiotis Kanavos
  • フィードバックをありがとう、修正しました。 - Dr Rob Lang

リンクされた質問


関連する質問

最近の質問