2017-02-01 4 views
4

는 C#에서 다음과 같은 구조를 고려하십시오부재는 구조체로 작업 할 때와 속성

public struct TestStruct 
{ 
    public int Number { get; set; } 

    public TestStruct(int num) 
    { 
     Number = num; 
    } 
} 

나는 일이 (thisthat 질문에 제공 컴파일하려고하면 발생하는 컴파일 오류가 매우 잘 알고을 예).

그러나 최근 이러한 구조는 2015 년

내가 전술 행동을 포함 할 것입니다 컴파일러에 대한 변경 로그를 찾을 수 없습니다 Visual Studio에서 완벽하게 컴파일 된 것으로 나타났습니다. 누구라도 그러한 정보를 어디에서 찾을 수 있는지에 대한 지침을 제공 할 수 있습니까? 나는 비슷한 것을 언급 한 것을 발견했다 here.

또한, 컴파일러 오류에 대한 페이지 CS0188 상태 : 그들은 더지지 필드가 없으며, 따라서 생성자에서 어떤 방식으로 초기화 할 수 없기 때문에

자동 구현 속성

는 구조체에 피해야한다.

그러나 생성자에서 속성을 초기화 할 수 없음을 알 수 없습니다.

답변

4

이것은 C# 6의 새로운 기능입니다 (VS2015에서 기본적으로 사용하게 될 것입니다). 해당 컴파일러 오류에 대한 설명이 정확하지 않습니다. 자동 속성에는 항상 컴파일러에서 생성 된 백킹 필드가 있으며 코드에서 직접 액세스 할 수 없습니다. 그래서 약간 오도하는 것입니다.

이제 C#에서 자동 속성 초기화를 변경하면 컴파일러에서 생성자에서 setter 메서드를 호출하는 대신 지원 필드를 설정하는 코드를 생성 할 수 있습니다. 이것은 또한 훨씬 쉽게 변경할 수 구조체를 만들 수 있습니다 : 나는이 프로젝트에 대해 서로 다른 언어 버전의 설정을 시도했다고 언급 잊어 버린

public struct Foo 
{ 
    public string ReadOnlyString { get; } 

    public Foo(string prop) 
    { 
     ReadOnlyString = prop; 
    } 
} 
+0

을 그것도 당신이 아무튼 제공하는 C# 4. 예와 함께 완벽하게 작동 예상대로 C# 4에서 작동하지 않습니다. 그것은 저에게 언어적인 문제가 아니라 컴파일러의 문제라고 생각합니다. 어쨌든 논리적 인 것처럼 보이지만 어디서도 언급되지 않은 이유를 알지 못하고 C# 6의 속성 초기화를 설명하는 섹션에서 제공되지 않았습니다. –

+1

@ vlad.stryapko 언어 버전을 변경하면 생각하는 바가 잘 수행되지 않습니다. 그렇습니다. 다른 컴파일러 버전을 설정하면 컴파일러에서 허용 할 구문 만 변경됩니다. 컴파일러가 실제로 작동하는 방식은 변경되지 않습니다. [이 질문] (http://stackoverflow.com/questions/29476057/how-to-compile-c-sharp-with-specific-language-version)을 참조하십시오. – Kyle

+0

그래서 C# 6의 읽기 전용 속성을 지원하기 위해 컴파일러에서 다르게 작업하고 필드를 직접 설정하므로 오류가 발생하지 않습니다. –