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; 개인 집합;} 또는 private 멤버 _color를 정의 할 수 있으며 get을 통해 해당 값을 반환하고 생성자에서 _color - Monah
  • C #6에서 작동합니다. < 6에서 자동 속성은 get 접근 자만 선언 할 수 없습니다. - Chris
  • @whytheq 어떤 Visual Studio 버전을 사용하고 있습니까? 2015 년에 귀하의 코드와Colour{ get; } = "green"작동 할 것이다. 이전 버전에서는 그 중 아무 것도 사용하지 않으므로 개인 설정기를 선언해야합니다.Colour {get;private set;} - Panagiotis Kanavos
  • 그것은 C #6뿐만 아니라 C #6으로 표시되지 않았습니다. - AnthonyLambert
  • 당신이 이것을 실행하기 위해 4.6을 필요로하지 않는다면 문제없이 4.5를 목표로 할 수 있습니다. 언어와 런타임은여기에서 논의 된. 실제로 VS2015를 프로덕션 코드로 사용하여 4.5 년 동안 목표를 설정했습니다. - Panagiotis Kanavos

4 답변


8

귀하의 코드는 Visual Studio 2015와 함께 제공되는 C #6에 유효합니다.아니이전 버전의 언어 또는 Visual Studio에 유효합니다. 기술적으로 VS 2013에 Roslyn의 이전 시험판 버전을 설치할 수 있지만 VS 2015가 출시 된 지금은 문제가되지 않습니다.

이 문제가 발생하려면 Visual Studio의 잘못된 버전을 사용하여 C #6 코드를 컴파일하거나 잘못된 개발 환경을 사용하여 명령 줄에서 코드를 컴파일하려고합니다. 예를 들어 PATH가 이전 컴파일러를 가리 킵니다. 아마 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;
}

두 번째 옵션은 읽기 전용이 아니므로 클래스의 다른 멤버는 여전히 속성을 수정할 수 있습니다.

노트

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 구문입니다. 나는 이것을 몇 개월 동안 사용 해왔다. 두 번째 예제,{get;}="green"자동 속성 초기화 프로그램입니다. - Panagiotis Kanavos

2

내 생각에 당신이 찾고있는 것은 GET을 외부 세계에 노출시킴으로써 내부 변수를 보호하는 this 일 뿐이다. 추가 안전을 위해 _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가 잘못된 컴파일러를 사용한다는 것은 다른 질문입니다. - Panagiotis Kanavos
  • @PanagiotisKanavos 코드는 C #6 일 수도 있고 OP 유형 오류를 일으킬 수있는 유사한 유형 또는 유사한 것도있을 수 있습니다. OP가 말하지 않는 것처럼 우리는 모른다. - HimBromBeere
  • @HimBromBelee 태그를 추가했습니다. 잘못된 컴파일러를 사용하고 있습니다. 아마 이것도 유효한 질문이 아닐 수도 있습니다. 나는 완전히 새로운 것이기 때문에 나는 모든 도움에 감사한다. - 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;
}


  • 두 번째 제안은 컴파일되지 않았습니다.get; private set; - dcastro
  • { get { return colour; } private set; }작동하지 않아 컴파일하지 못할 수도 있습니다. 그런 뜻 이었습니까{get; private set;}? - Panagiotis Kanavos
  • 피드백에 감사 드리며 해결했습니다. - Dr Rob Lang

연결된 질문


관련된 질문

최근 질문