속성 선언과 관련된 오류 및 경고

속성 선언과 관련된 다음 오류가 발생할 수 있습니다.

  • CS0200: 속성 또는 인덱서 'property'를 할당할 수 없습니다. 읽기 전용입니다.
  • CS0273: '접근자' 접근자의 접근성 한정자는 속성 또는 인덱서 'property'보다 더 제한적이어야 합니다.
  • CS0274: 속성 또는 인덱서 'property'의 두 접근자에 대해 접근성 한정자를 지정할 수 없습니다.
  • CS0275: '접근자': 인터페이스의 접근자에 접근성 한정자를 사용할 수 없습니다.
  • CS0276: 'property': 접근자에 대한 접근성 한정자는 속성 또는 인덱서에 get 및 set 접근자가 모두 있는 경우에만 사용할 수 있습니다.
  • CS0442: 'property': 추상 속성에는 프라이빗 접근자를 가질 수 없습니다.
  • CS0544: 'property': 'member'가 속성이 아니므로 재정의할 수 없습니다.
  • CS0545: 'function': 'property'에 재정의 가능한 get 접근자가 없으므로 재정의할 수 없습니다.
  • CS0546: 'accessor': 'property'에 재정의 가능한 set 접근자가 없으므로 재정의할 수 없습니다.
  • CS0547: 'property': 속성 또는 인덱서는 void 형식을 가질 수 없습니다.
  • CS0548: 'property': 속성 또는 인덱서에 하나 이상의 접근자가 있어야 합니다.
  • CS0571: 'function': 명시적으로 연산자 또는 접근자를 호출할 수 없습니다.
  • CS0610: 필드 또는 속성은 'type' 형식일 수 없습니다.
  • CS0840: '속성 이름'은 추상 또는 extern으로 표시되지 않으므로 본문을 선언해야 합니다. 자동으로 구현된 속성은 get 및 set 접근자를 모두 정의해야 합니다.
  • CS1014: get 또는 set 접근자가 필요합니다.
  • CS1043: { 또는 ; 예상
  • CS1715: 'type': 재정의된 멤버 'member'과 일치하려면 형식이 'type'이어야 합니다.
  • CS8050: 자동 구현 속성 또는 'field' 키워드를 사용하는 속성만 이니셜라이저를 사용할 수 있습니다.
  • CS8051: 자동 구현 속성에는 get 접근자가 있어야 합니다.
  • CS8053: 인터페이스의 인스턴스 속성에는 이니셜라이저가 있을 수 없습니다.
  • CS8080: 자동 구현 속성은 재정의된 속성의 모든 접근자를 재정의해야 합니다.
  • CS8145: 자동 구현 속성은 참조로 반환할 수 없습니다.
  • CS8147: 참조로 반환되는 속성은 접근자를 설정할 수 없습니다.
  • CS8341: 읽기 전용 구조체의 자동 구현 인스턴스 속성은 읽기 전용이어야 합니다.
  • CS8657: 정적 멤버 'member'를 'readonly'로 표시할 수 없습니다.
  • CS8658: 자동 구현된 'set' 접근자를 'readonly'로 표시할 수 없습니다.
  • CS8659: 자동 구현 속성 'property'는 'set' 접근자가 있기 때문에 'readonly'로 표시할 수 없습니다.
  • CS8660: 속성 또는 인덱서 'property'와 해당 접근자에 'readonly' 한정자를 모두 지정할 수 없습니다. 둘 중 하나를 제거해야 합니다.
  • CS8661: 속성 또는 인덱서 'property'의 두 접근자에 대해 'readonly' 한정자를 지정할 수 없습니다. 대신 속성 자체에 'readonly' 한정자를 배치합니다.
  • CS8664: 'property': 'readonly'는 속성 또는 인덱서에 get 및 set 접근자가 모두 있는 경우에만 접근자에서 사용할 수 있습니다.
  • CS8852: Init 전용 속성 또는 인덱서 'property'는 개체 이니셜라이저 또는 인스턴스 생성자 또는 'init' 접근자의 'this' 또는 'base'에서만 할당할 수 있습니다.
  • CS8853: 'member'는 재정의된 멤버 'member'의 init 전용과 일치해야 합니다.
  • CS8855: 접근자 '접근자' 및 '접근자'는 모두 init 전용이거나 둘 다 아니어야 합니다.
  • CS8856: 'init' 접근자는 정적 멤버에 사용할 수 없습니다.
  • CS8903: 'init' 접근자를 'readonly'로 표시할 수 없습니다. 대신 'property'를 읽기 전용으로 표시합니다.
  • CS9029: 형식 및 별칭의 이름은 'required'로 지정할 수 없습니다.
  • CS9030: 필수 멤버 'member'를 재정의하기 때문에 'member'는 필수여야 합니다.
  • CS9031: 필수 멤버 'member'는 'member'에 의해 숨겨질 수 없습니다.
  • CS9032: 필요한 멤버는 포함 형식보다 덜 표시되거나 setter가 덜 표시될 수 없습니다.
  • CS9033: 'System.Runtime.CompilerServices.RequiredMemberAttribute'를 사용하지 마세요. 대신 필수 필드 및 속성에 'required' 키워드를 사용합니다.
  • CS9034: 필수 멤버를 설정할 수 있어야 합니다.
  • CS9035: 개체 이니셜라이저 또는 특성 생성자에서 필수 멤버를 설정해야 합니다.
  • CS9036: 필요한 멤버 'memberName'에 값이 할당되어야 하며 중첩 멤버 또는 컬렉션 이니셜라이저를 사용할 수 없습니다.
  • CS9037: 'type'에 필요한 멤버 목록이 잘못되어 해석할 수 없습니다.
  • CS9038: 기본 형식 'type'에 필요한 멤버 목록이 잘못되어 해석할 수 없습니다. 이 생성자를 사용하려면 'SetsRequiredMembers' 특성을 적용합니다.
  • CS9039: 이 생성자는 해당 특성이 있는 생성자에 연결되므로 'SetsRequiredMembers'를 추가해야 합니다.
  • CS9040: 형식은 필요한 멤버가 있으므로 제네릭 형식 또는 메서드의 매개 변수에 대한 'new()' 제약 조건을 충족할 수 없습니다.
  • CS9042: 포함된 형식이 사용되지 않거나 모든 생성자가 사용되지 않는 한 필수 멤버는 'ObsoleteAttribute'로 특성을 지정해서는 안 됩니다.
  • CS9045: 필요한 멤버는 스크립트 또는 제출의 최상위 수준에서 허용되지 않습니다.
  • CS9258: 이 언어 버전에서 'field' 키워드는 속성에 대한 합성된 지원 필드에 바인딩됩니다. 합성된 지원 필드가 생성되지 않도록 하고 기존 멤버를 참조하려면 대신 '' 또는 'this.field@field'를 사용합니다.
  • CS9263: 부분 속성은 정의와 구현 둘 다에 이니셜라이저를 가질 수 없습니다.

필드 지원 속성에 대해 다음 경고를 생성할 수 있습니다.

  • CS9264: 생성자를 종료할 때 null을 허용하지 않는 속성 'property'는 null이 아닌 값을 포함해야 합니다. 'required' 한정자를 추가하거나 속성을 nullable로 선언하거나 'field' 접근자에서 'get'가 null인 경우를 안전하게 처리하는 것이 좋습니다.
  • CS9266: 'property' 속성의 '접근자' 중 하나가 'field'을 사용하므로, 다른 '접근자'도 'field'을 사용해야 합니다.
  • CS9273: 이 언어 버전에서 'field'은 속성 접근자 내의 키워드입니다. 변수 이름을 바꾸거나 식별자 '@field'를 대신 사용합니다.

다음 섹션에서는 이러한 오류 및 경고의 원인과 수정을 설명합니다.

접근자 접근성

  • CS0273: '접근자' 접근자의 접근성 한정자는 속성 또는 인덱서 'property'보다 더 제한적이어야 합니다.
  • CS0274: 속성 또는 인덱서 'property'의 두 접근자에 대해 접근성 한정자를 지정할 수 없습니다.
  • CS0275: '접근자': 인터페이스의 접근자에 접근성 한정자를 사용할 수 없습니다.
  • CS0276: 'property': 접근자에 대한 접근성 한정자는 속성 또는 인덱서에 get 및 set 접근자가 모두 있는 경우에만 사용할 수 있습니다.
  • CS0442: 'property': 추상 속성에는 프라이빗 접근자를 가질 수 없습니다.

이러한 오류는 속성 및 인덱서 접근자에 대한 액세스 한정자 규칙을 강제합니다. 전체 규칙은 C# 사양에서 접근자 접근성접근자 제한 기능을 참조하세요. 이러한 오류를 수정하려면 특정 진단에 따라 다음 변경 내용 중 하나를 적용합니다.

  • 속성의 선언된 접근성(CS0273)보다 더 제한적인 액세스 한정자를 사용합니다. 예를 들어, internal 속성에는 private set 접근자가 있을 수 있지만 public get 접근자는 없습니다. 접근자의 접근성은 속성 접근성의 적절한 하위 집합이어야 합니다.
  • 두 접근자 중 하나에만 액세스 한정자를 적용합니다(CS0274). 속성 선언 자체는 두 접근자에 대한 기본 접근성을 설정하며, 하나의 접근자만 해당 기본값과 다를 수 있습니다. 액세스 한정자를 제한된 액세스가 필요한 접근자에 배치합니다.
  • 인터페이스 속성 선언의 접근자에서 액세스 한정자를 제거합니다(CS0275). 인터페이스 멤버는 공용 계약을 정의하며 개별 접근자에 대한 액세스 한정자는 허용되지 않습니다. 액세스를 제한해야 하는 경우 구현 클래스에 제한을 대신 적용합니다.
  • 속성에 getset 접근자를 모두 추가한 다음, 둘 중 하나에 액세스 한정자(CS0276)를 적용하십시오. 접근자의 액세스 한정자는 한 접근자의 가시성을 다른 접근자와 구분하므로 두 접근자가 모두 있어야 합니다. 속성에 접근자가 하나만 있는 경우 액세스 한정자를 제거합니다.
  • 추상 속성 접근 private 자의 액세스 한정자를 덜 제한적인 한정자(CS0442)로 변경합니다. 이러한 클래스가 구현을 제공할 수 있도록 추상 멤버는 파생 클래스에 액세스할 수 있어야 합니다. protected, internal 또는 protected internalprivate 대신 사용하십시오.

자세한 내용은 접근자 접근성 및 속성 제한(Restricting Accessor Accessibility and Properties)을 참조 하세요.

속성 선언 구문

  • CS0547: 'property': 속성 또는 인덱서는 void 형식을 가질 수 없습니다.
  • CS0548: 'property': 속성 또는 인덱서에 하나 이상의 접근자가 있어야 합니다.
  • CS0571: 'function': 명시적으로 연산자 또는 접근자를 호출할 수 없습니다.
  • CS0610: 필드 또는 속성은 'type' 형식일 수 없습니다.
  • CS0840: '속성 이름'은 추상 또는 extern으로 표시되지 않으므로 본문을 선언해야 합니다. 자동으로 구현된 속성은 get 및 set 접근자를 모두 정의해야 합니다.
  • CS1014: get 또는 set 접근자가 필요합니다.
  • CS1043: { 또는 ; 예상

이러한 오류는 속성 및 인덱서 선언의 구조적 요구 사항을 적용합니다. 전체 규칙은 C# 사양의 속성속성 섹션을 참조하세요. 이러한 오류를 수정하려면 특정 진단에 따라 다음 변경 내용 중 하나를 적용합니다.

  • 속성 형식을 유효한 형식 void (CS0547)으로 변경합니다. 속성 및 인덱서는 식을 나타내며 void 유효한 식 형식이 아닙니다. 속성이 나타내는 데이터에 적합한 형식을 선택합니다.
  • 속성 선언(getsetinit)에 하나 이상의 접근자(또는)를 추가합니다. 접근자가 없는 속성은 해당 값을 읽거나 쓸 방법이 없습니다. get 접근자와 set 또는 init 접근자 모두를 포함합니다.
  • 접근자 메서드를 직접 호출하는 대신 속성 구문을 사용하여 속성에 액세스합니다(CS0571). 속성 접근자는 get_PropertyNameset_PropertyName라는 이름의 메서드로 컴파일되지만, 속성 구문(obj.Propertyobj.Property = value)을 통해 이러한 메서드를 호출합니다. 연산자도 동일한 원칙이 적용됩니다. 와 같은 ++obj메서드를 호출하는 대신 연산자 구문(op_Increment)을 사용합니다.
  • 필드 또는 속성 형식을 제한된 형식에서 허용된 형식(CS0610)으로 변경합니다. TypedReferenceArgIterator와 같은 특정 유형은 필드나 속성으로 사용할 수 없습니다. 이러한 형식은 여전히 메서드 매개 변수 또는 지역 변수로 사용할 수 있습니다.
  • 읽기 전용 속성에는 get 전용 자동 구현 속성을 선언합니다. 자동 구현 속성 선언에 getset 접근자를 추가하거나, 명시적 접근자 본문을 제공하십시오(CS0840). 사용자 지정 논리가 필요한 속성의 경우, C# 13에 추가된 field 키워드를 사용하여 접근자 메서드 본문에서 컴파일러가 생성한 지원 필드에 접근합니다. abstract 또는 extern 속성의 접근자 본문을 제거하십시오. 구현은 다른 곳에서 제공됩니다. 속성의 경우 partial 선언 및 구현을 부분 형식 선언 간에 분할합니다.
  • 속성 본문에 유효한 접근자 키워드getset(또는 initCS1014)만 포함되어 있는지 확인합니다. 속성 본문은 임의의 문 또는 멤버 선언을 포함할 수 없습니다. 속성 외부의 필드와 메서드를 클래스 또는 구조체 본문으로 이동합니다.
  • 중괄호나 식 본문을 사용하여 적절한 속성 접근자 구문(CS1043)을 사용하세요. 접근자 본문은 중괄호 { } 를 사용해야 하며, 식 본문 접근자는 => 구문을 사용해야 하고, 자동 구현 속성은 접근자 토큰 뒤에 세미콜론으로 끝나야 합니다.

자세한 내용은 속성, 자동 구현 속성속성 사용을 참조하세요.

속성 재정의

  • CS0544: 'property': 'member'가 속성이 아니므로 재정의할 수 없습니다.
  • CS0545: 'function': 'property'에 재정의 가능한 get 접근자가 없으므로 재정의할 수 없습니다.
  • CS0546: 'accessor': 'property'에 재정의 가능한 set 접근자가 없으므로 재정의할 수 없습니다.
  • CS1715: 'type': 재정의된 멤버 'member'와 일치하려면 타입이 'type'이어야 합니다.
  • CS8080: 자동 구현 속성은 재정의된 속성의 모든 접근자를 반드시 재정의해야 합니다.

이러한 오류는 파생 클래스의 속성을 재정의하기 위한 규칙을 적용합니다. 전체 규칙은 C# 사양의 상속가상, 봉인, 재정의 및 추상 접근자 섹션을 참조하세요. 이러한 오류를 수정하려면 특정 진단에 따라 다음 변경 내용 중 하나를 적용합니다.

  • 재정의하는 멤버가 필드나 메서드(CS0544)가 아닌 속성인지 확인합니다. 속성의 키워드는 override 기본 클래스의 virtualabstract속성 또는 override 속성만 대상으로 지정할 수 있습니다. 속성이 아닌 멤버를 속성으로 가리려면 new 대신 override 키워드를 사용합니다.
  • 기본 클래스 속성 선언(CS0545, CS0546)에 있는 접근자만 재정의하십시오. 재정의할 가상 메서드가 없으므로 기본 클래스에 없거나 액세스할 수 없는 속성 접근자를 재정의할 수 없습니다. 기본 클래스 속성에 접근자만 있는 get 경우 재정의를 통해 접근자를 set 추가할 수 없습니다. 누락된 접근자를 기본 클래스에 추가하고 이를 virtual로 표시하거나, 기본 클래스 속성을 새 속성 정의로 숨기기 위해 new을 사용합니다.
  • 재정의된 멤버(CS1715)의 형식에 맞춰 재정의 속성의 형식을 조정하십시오. 읽기 전용(get-only) 속성은 C# 9부터 공변 반환 형식을 지원하므로 재정의는 더 파생된 형식을 반환할 수 있습니다. 속성에 set 또는 init 접근자가 있을 경우, setter가 선언된 형식의 값을 허용하기 때문에 정확한 형식 일치가 필요합니다. setter가 있는 속성에 다른 형식이 필요한 경우 기본 클래스 선언과 일치하도록 파생 클래스의 속성 형식을 변경하거나 setter를 제거하고 공변 반환 형식을 대신 사용합니다.
  • 자동 구현 속성(CS8080)으로 재정의할 때 기본 속성의 모든 접근자를 포함합니다. 자동 구현 속성은 스토리지 구현과 접근자 구현을 모두 생성하므로 기본 클래스에 있는 모든 접근자를 재정의해야 합니다. 기본 속성에 getset 둘 다 있는 경우, 자동 구현 재정의에도 둘 다 있어야 합니다. 특정 접근자만 재정의하려면 자동 구현을 사용하는 대신 명시적 접근자 본문과 명시적 백킹 필드를 사용하여 속성을 구현합니다. 기본 클래스 속성에 접근자가 있는 private 경우 자동 구현된 속성으로 속성을 재정의할 수 없습니다. 대신 명시적 접근자 본문을 사용합니다.

자세한 내용은 상속, 속성속성 사용을 참조하세요.

필드 기반 속성

  • CS9258: 이 언어 버전에서 'field' 키워드는 속성에 대한 합성된 지원 필드에 바인딩됩니다. 합성된 지원 필드가 생성되지 않도록 하고 기존 멤버를 참조하려면 대신 '' 또는 'this.field@field'를 사용합니다.
  • CS9263: 부분 속성은 정의와 구현 둘 다에 이니셜라이저를 가질 수 없습니다.
  • CS9264: 생성자를 종료할 때 null을 허용하지 않는 속성 'property'는 null이 아닌 값을 포함해야 합니다. 'required' 한정자를 추가하거나 속성을 nullable로 선언하거나 'field' 접근자에서 'get'가 null인 경우를 안전하게 처리하는 것이 좋습니다.
  • CS9266: 'property' 속성의 '접근자'는 다른 접근자가 'field'을 사용하고 있으므로, 동일하게 'field'을 사용해야 합니다.
  • CS9273: 이 언어 버전에서 'field'은 속성 접근자 내의 키워드입니다. 변수 이름을 바꾸거나 식별자 '@field'를 대신 사용합니다.

필드 지원 속성 오류를 수정하려면 특정 진단에 따라 다음 변경 내용 중 하나를 적용합니다.

  • field으로 명명된 변수를 다른 식별자로 이름을 변경하거나, @field 이스케이프 구문을 사용하여 변수를 참조하십시오(CS9258, CS9273). 이 수정은 C# 13 이상에서 속성 접근자 내부에서 컴파일러가 합성한 지원 필드를 참조하는 컨텍스트 키워드이기 때문에 필요합니다. 기존 멤버 field에 액세스하려면, 참조를 명확하게 하기 위해 합성된 지원 필드 대신 this.field을 사용하여 해당 멤버를 한정하세요.
  • 부분 속성 정의 또는 구현에서 이니셜라이저를 제거하고 하나만 유지합니다(CS9263). 두 위치에서 이니셜라이저를 허용하면 사용해야 하는 값이 모호해지고 지원 필드가 잠재적으로 다른 값으로 두 번 초기화될 수 있으므로 이 수정이 필요합니다.
  • [field: MaybeNull, AllowNull] 속성 선언에 특성을 추가하여 지원 필드를 nullable(CS9264)으로 처리해야 함을 나타냅니다. 이 수정은 속성 형식과 컴파일러 합성 지원 필드 간의 null 허용 여부 기대치를 조정하여 속성이 nullable이 아닌 것으로 선언되었지만 field 키워드 사용으로 인해 null일 수 있음을 시사하는 불일치를 해결합니다. 또는 속성 형식을 nullable로 변경하거나, 초기화를 보장하기 위해 한정자를 추가 required 하거나, 생성자에서 속성을 초기화합니다.
  • 두 접근자에서 field 키워드를 일관되게 사용하거나, 두 접근자에서 명시적으로 뒷받침 필드를 사용하세요 (CS9266). 이 수정은 한 접근자가 컴파일러 합성 지원 필드를 수정하는 동안 다른 접근자가 다른 스토리지 위치를 수정하여 일관되지 않은 속성 동작을 초래하는 잠재적인 버그를 방지합니다.

자세한 내용은 필드 키워드Partial 속성을 참조하세요.

읽기 전용 속성

  • CS0200: 속성 또는 인덱서 'property'를 할당할 수 없습니다. 읽기 전용입니다.
  • CS8341: 읽기 전용 구조체의 자동 구현 인스턴스 속성은 읽기 전용이어야 합니다.
  • CS8657: 정적 멤버 'member'를 'readonly'로 표시할 수 없습니다.
  • CS8658: 자동 구현된 'set' 접근자를 'readonly'로 지정할 수 없습니다.
  • CS8659: 자동 구현 속성 'property'는 'set' 접근자가 있어서 'readonly'로 설정할 수 없습니다.
  • CS8660: 속성 또는 인덱서 'property'와 해당 접근자에 대해 'readonly' 한정자를 지정할 수 없습니다. 그 중 하나를 제거하십시오.
  • CS8661: 속성 또는 인덱서 'property'의 두 접근자에 대해 'readonly' 한정자를 지정할 수 없습니다. 대신 속성 자체에 'readonly' 한정자를 배치합니다.
  • CS8664: 'property': 'readonly'는 속성 또는 인덱서에 get 및 set 접근자가 모두 있는 경우에만 접근자에서 사용할 수 있습니다.

읽기 전용 속성 오류를 수정하려면 특정 진단에 따라 다음 변경 내용 중 하나를 적용합니다.

  • 쓰기 가능하도록 속성에 a set 또는 init 접근자를 추가합니다(CS0200). set 접근자가 없는 속성은 읽기 전용이며 선언 형식의 생성자 또는 필드 이니셜라이저에서만 할당할 수 있으므로 이 수정이 필요합니다. 개체를 초기화하는 동안 속성을 설정해야 하지만 나중에는 변경할 수 없는 경우, init 접근자 대신 set 접근자를 사용하세요. 속성이 읽기 전용으로 유지되어야 하는 경우 초기화가 허용되는 생성자로 할당을 이동하거나 할당이 필요한지 여부를 다시 고려합니다.
  • 자동 구현 인스턴스 속성을 readonly에 선언할 때 readonly struct (CS8341). 이 수정은 포함된 구조체의 불변성 계약을 적용하여 모든 인스턴스 멤버가 보증을 readonly 준수하도록 합니다. 속성을 변경할 필요가 있는 경우, 구조체 선언에서 readonly 한정자를 제거하거나, 인스턴스 상태를 변경하지 않는 명시적 백킹 필드 및 접근자 메서드를 사용하여 속성을 구현하십시오.
  • readonly 정적 속성 또는 접근자 선언(CS8657)에서 한정자를 제거합니다. 한정자는 인스턴스 상태를 수정하지 않으며 정적 멤버는 보호할 인스턴스 상태가 없음을 나타내기 위해 구조체의 인스턴스 멤버에만 적용되므로 이 수정이 필요합니다 readonly . 정적 읽기 전용 속성이 필요한 경우 set 접근자를 생략하고 readonly 수정자를 사용하지 마십시오.
  • readonly 자동 구현 set 접근자에서 한정자를 제거하거나 접근자에 get 만 적용합니다(CS8658). 인스턴스 상태를 수정하지 않도록 보장하는 set 한정자와 모순되게 접근자가 본질적으로 상태를 수정하기 때문에 readonly의 수정이 필요합니다. 초기화 중에 설정할 수 있지만 나중에 읽기 전용인 속성이 필요한 경우 init 접근자를 set 접근자 대신 사용합니다.
  • 속성에 readonly 접근자가 있는 경우, 속성 선언에서 set 한정자를 제거합니다(CS8659). 인스턴스 상태를 수정할 수 있는 set 접근자가 있는 속성 때문에 readonly 보장이 위반될 수 있으므로 이 수정이 필요합니다. 초기화 시간 설정만 필요한 경우, set 접근자를 init 접근자로 바꾸거나 set 접근자를 완전히 제거하여 속성을 실제로 읽기 전용으로 만드세요.
  • readonly 속성 선언 또는 개별 접근자에 한정자를 배치하지만 둘 다 배치하지는 않습니다(CS8660, CS8661). 이 수정은 어떤 한정자가 우선적으로 적용되는지 혼동을 일으킬 수 있는 중복 한정자 선언을 방지합니다. 특정 접근자를 readonly표시하려면 속성 선언에서 한정자를 제거하고 접근자에만 배치합니다. 또는 모든 접근자가 있어야 하는 readonly경우 개별 접근자가 아닌 속성 자체를 표시합니다.
  • 개별 접근자를 get로 표시하는 경우 setreadonly 접근자가 모두 있는지 확인합니다 (CS8664). 개별 접근자의 한정자는 상태를 수정하는 접근자와 그렇지 않은 접근자를 구분하기 때문에 readonly 이 수정이 필요하며, 이는 두 접근자 형식이 모두 존재하는 경우에만 의미가 있습니다. 속성에 get 접근자만 있는 경우, 개별 접근자 대신 전체 속성을 readonly로 표시합니다.

자세한 내용은 readonly 인스턴스 멤버, init 키워드속성을 참조하세요.

초기화 전용 속성

  • CS8852: Init 전용 속성 또는 인덱서 'property'는 개체 이니셜라이저 또는 인스턴스 생성자 또는 'init' 접근자의 'this' 또는 'base'에서만 할당할 수 있습니다.
  • CS8853: 'member'는 재정의된 멤버 'member'의 init 전용과 일치해야 합니다.
  • CS8855: 접근자 '접근자' 및 '접근자'는 모두 init 전용이거나 둘 다 아니어야 합니다.
  • CS8856: 정적 멤버에서 'init' 접근자는 유효하지 않습니다
  • CS8903: 'init' 접근자를 'readonly'로 표시할 수 없습니다. 대신 'property'를 읽기 전용으로 표시합니다.

이러한 오류는 접근자에 init 대한 규칙을 적용하여 변경할 수 없는 개체 초기화를 가능하게 합니다. 전체 규칙은 init 키워드를 참조하세요. 이러한 오류를 수정하려면 특정 진단에 따라 다음 변경 내용 중 하나를 적용합니다.

  • 할당을 개체 이니셜라이저, 생성자, 또는 init 접근자(CS8852)에서 초기화 전용 속성으로 이동하십시오. 개체 생성이 완료된 후에는 Init 전용 속성을 할당할 수 없습니다. 생성자 본문, init 접근자 또는 개체 이니셜라이저 식(new MyType { Property = value })의 값을 할당합니다. 생성 후 속성을 할당해야 하는 경우 접근자를 init 접근자로 set 변경합니다.
  • 속성을 재정의할 때 init 또는 set 접근자 종류와 일치시킵니다(CS8853). 기본 클래스 속성에 init 접근자를 사용하는 경우, 재정의 속성도 init 접근자를 사용해야 합니다. 마찬가지로 기본에서 set를 사용하는 경우, 재정의는 set를 사용해야 합니다. 이러한 일관성을 통해 기본 형식에 의해 설정된 불변성 계약이 파생 형식으로 유지됩니다.
  • 명시적 인터페이스 구현(init)의 두 접근자에서 동일한 접근자 종류(set또는)를 사용합니다. 형식이 동일한 속성을 선언하는 두 인터페이스를 명시적으로 구현할 때, 두 접근자 구현은 반드시 동의해야 합니다: 모두 init을 사용하거나, 모두 set을 사용해야 합니다.
  • init 정적 속성 선언에서 접근자를 제거하거나 접근자set(CS8856)로 변경합니다. init 접근자는 개체 생성과 관련된 인스턴스 초기화 패턴을 위해 설계되었으며, 정적 멤버는 개체 초기화에 관여하지 않습니다. set 변경 가능한 정적 속성에는 접근자를 사용하고, 읽기 전용 정적 속성의 경우 설정자를 완전히 제거합니다.
  • readonly 접근자에서 init 한정자를 제거하십시오 (CS8903). readonly 구조체 멤버의 한정자는 멤버가 구조체 인스턴스를 변경하지 않도록 보장합니다. 접근자가 init 인스턴스 상태에 할당하면 구조체가 본질적으로 변경되므로 readonly로 표시될 수 없습니다. 접근자를 get 만들려면 접근자에 readonly 한정자만 적용합니다readonly.get

자세한 내용은 init 키워드개체 및 컬렉션 이니셜라이저를 참조하세요.

속성 이니셜라이저

  • CS8050: 자동 구현 속성 또는 'field' 키워드를 사용하는 속성만 이니셜라이저를 사용할 수 있습니다.
  • CS8051: 자동 구현 속성에는 get 접근자가 있어야 합니다.
  • CS8053: 인터페이스의 인스턴스 속성에는 이니셜라이저가 있을 수 없습니다.

속성 이니셜라이저 오류를 수정하려면 특정 진단에 따라 다음 변경 내용 중 하나를 적용합니다.

  • 접근자 본문을 제거하고 컴파일러가 지원 필드(CS8050)를 생성하도록 하여 자동 구현 구문을 사용하도록 속성을 변환합니다. 컴파일러 관리 스토리지가 있는 속성에만 이니셜라이저가 있을 수 있으므로 접근자 논리가 실행되기 전에 초기화가 수행되도록 하므로 이 수정이 필요합니다. 또는 접근자를 구현하여 field 키워드를 사용하고 컴파일러가 합성한 백업 필드에 액세스하도록 수정합니다. 이 방법을 사용하면 사용자 지정 접근자 논리를 유지하면서 이니셜라이저를 사용할 수 있습니다. 두 방법 모두 적합하지 않은 경우 이니셜라이저를 제거하고 초기화 시퀀스를 완전히 제어할 수 있는 생성자의 값을 대신 할당합니다.
  • get 자동 구현 속성에 접근자를 추가하여 초기화된 값(CS8051)을 읽을 수 있도록 합니다. 이 수정은 이니셜라이저가 검색할 수 있어야 하는 값을 설정하고 쓰기 전용 속성이 속성 초기화에 대한 이러한 기본 기대치를 위반하기 때문에 필요합니다. 쓰기 전용 속성이 진정으로 필요한 경우 지원 필드를 사용하여 접근자를 명시적으로 구현하고 속성 이니셜라이저를 사용하는 대신 생성자에서 직접 필드를 할당합니다.
  • 인터페이스 속성 선언에서 이니셜라이저를 제거합니다(CS8053). 인터페이스는 초기 값으로 구체적인 구현을 제공하는 대신 형식을 구현하기 위한 계약을 정의하기 때문에 이 수정이 필요합니다. 기본값을 제공해야 하는 경우 인터페이스를 구현하는 클래스에서 속성을 구현하거나 기본 인터페이스 메서드(C# 8.0 이상에서 사용 가능)를 사용하여 기본 구현을 제공합니다.

자세한 내용은 속성, 자동 구현 속성필드 키워드를 참조하세요.

필수 멤버

  • CS9029: 형식 및 별칭의 이름은 'required'로 지정할 수 없습니다.
  • CS9030: 필요한 멤버 'member'를 재정의하기 때문에 'member'가 필요해야 합니다.
  • CS9031: 필수 멤버 'member'를 다른 'member'로 숨길 수 없습니다.
  • CS9032: 필요한 멤버는 포함 형식보다 덜 표시되거나 setter가 덜 표시될 수 없습니다.
  • CS9033: 'System.Runtime.CompilerServices.RequiredMemberAttribute'를 사용하지 마세요. 대신 필수 필드 및 속성에 'required' 키워드를 사용합니다.
  • CS9034: 필수 멤버를 설정할 수 있어야 합니다.
  • CS9035: 개체 이니셜라이저 또는 특성 생성자에서 필수 멤버를 설정해야 합니다.
  • CS9036: 필요한 멤버 'memberName'에 값이 할당되어야 하며 중첩 멤버 또는 컬렉션 이니셜라이저를 사용할 수 없습니다.
  • CS9037: 'type'에 필요한 멤버 목록이 잘못되어 해석할 수 없습니다.
  • CS9038: 기본 형식 'type'에 필요한 멤버 목록이 잘못되어 해석할 수 없습니다. 이 생성자를 사용하려면 'SetsRequiredMembers' 특성을 적용합니다.
  • CS9039: 이 생성자는 해당 특성이 있는 생성자에 연결되므로 'SetsRequiredMembers'를 추가해야 합니다.
  • CS9040: 형식은 필요한 멤버가 있으므로 제네릭 형식 또는 메서드의 매개 변수에 대한 'new()' 제약 조건을 충족할 수 없습니다.
  • CS9042: 포함된 형식이 사용되지 않거나 모든 생성자가 사용되지 않는 한 필수 멤버는 'ObsoleteAttribute'로 특성을 지정해서는 안 됩니다.
  • CS9045: 필요한 멤버는 스크립트 또는 제출의 최상위 수준에서 허용되지 않습니다.

필요한 멤버 오류를 수정하려면 특정 진단에 따라 다음 변경 내용 중 하나를 적용합니다.

  • 형식 또는 별칭 이름으로 사용하지 required 마세요(CS9029). 이 수정은 C# 11 이상에서 required가 상황별 키워드이므로, 키워드가 나타날 수 있는 코드에서 이를 형식 이름으로 사용하면 모호성이 생기기 때문에 필요합니다.
  • 필요한 멤버를 재정의할 때 파생 멤버가 required 한정자를 유지 관리하는지 확인합니다(CS9030). 이 수정은 기본 클래스에 의해 설정된 계약을 적용하여 모든 파생 형식이 동일한 초기화 요구 사항을 유지하도록 보장합니다. 필수가 아닌 멤버로 필수 멤버를 파생 클래스(CS9031)에서 숨기는 것을 피하세요. 이 작업은 소비자가 기본 형식에서 기대하는 초기화 계약을 무너뜨리기 때문입니다.
  • 필요한 멤버를 해당 형식만큼 또는 그보다 더 잘 보이도록 하고, 속성 setter도 충분히 잘 보이도록 설정합니다(CS9032). 이렇게 수정하면 형식에 공개적으로 액세스할 수 있지만 형식이 생성되는 모든 컨텍스트에서 필요한 멤버를 초기화할 수 없는 상황을 방지할 수 있습니다.
  • required 수동으로 적용하는 대신 키워드를 RequiredMemberAttribute 사용합니다(CS9033). 이렇게 수정하면 컴파일러가 올바른 메타데이터를 생성하고 필요한 모든 멤버 규칙을 적용합니다. 수동 특성 애플리케이션이 제대로 수행되지 않을 수 있습니다.
  • 필수 멤버가 접근자를 설정했거나 설정할 수 있는지 확인합니다(CS9034). 이 수정은 쓰기 액세스가 필요한 개체를 만드는 동안 필요한 멤버를 초기화해야 하기 때문에 필요합니다. 인스턴스를 만들 때 개체 이니셜라이저(CS9035, CS9036)에서 필요한 멤버를 직접 초기화합니다. 속성에 액세스하기 전에 필요한 멤버 자체를 설정해야 하므로 중첩 멤버 이니셜라이저 또는 컬렉션 이니셜라이저를 사용하는 대신 각 필수 멤버에 값을 할당해야 합니다.
  • SetsRequiredMembers 특성을 모든 필수 멤버를 초기화하는 생성자의 본문에 적용합니다(CS9038, CS9039). 이 수정은 생성자가 필요한 멤버 계약을 수행하여 개체 이니셜라이저 없이 개체를 만들 수 있도록 컴파일러에 알릴 수 있습니다. 다른 생성자에 SetsRequiredMembers와 연결된 생성자는 그 특성을 가져야 합니다.
  • 매개 변수가 없는 생성자는 개체 이니셜라이저 없이 필요한 멤버 초기화를 보장할 수 없기 때문에 제약 조건(new())을 충족 해야 하는 형식에서 필수 멤버를 사용하지 마세요. 포함된 형식이나 모든 생성자가 사용되지 않는 경우가 아니라면(CS9042), 필수 멤버를 사용되지 않는 것으로 표시하지 마세요. 이는 멤버가 필요하지만 사용이 권장되지 않는 상황을 방지하기 위함입니다. 이러한 컨텍스트는 필요한 멤버를 설정하는 데 필요한 개체 초기화 구문을 지원하지 않으므로 최상위 문 또는 스크립트 컨텍스트(CS9045)에서는 필수 멤버가 허용되지 않습니다.

자세한 내용은 필수 한정자 참조 문서 및 개체 및 컬렉션 이니셜라이저 가이드를 참조하세요 .

참조 반환 속성

  • CS8145: 자동 구현 속성은 참조로 반환할 수 없습니다.
  • CS8147: 참조로 반환되는 속성은 접근자를 설정할 수 없습니다.

참조 반환 속성 오류를 수정하려면 특정 진단에 따라 다음 변경 내용 중 하나를 적용합니다.

  • 지원 필드를 사용하여 속성(property)을 명시적으로 구현하고 ref 키워드를 접근자의 반환 식에서 사용합니다(get). 자동 구현 속성은 컴파일러가 내부적으로 관리하는 프라이빗 지원 필드를 생성하기 때문에 이 수정이 필요합니다. 프라이빗 필드에 대한 참조를 반환하면 호출자가 직접 액세스해서는 안 되는 내부 스토리지가 노출됩니다. ref-returning 속성을 만들려면 명시적 필드를 선언하고 구문을 사용하여 => ref backingField 반환합니다. 또는 스토리지를 직접 수정할 수 있도록 참조를 반환할 필요가 없는 경우, 속성 선언에서 ref 한정자를 제거합니다.
  • 참조 반환 속성(set)에서 접근자를 제거합니다. 참조 반환 속성은 이미 반환된 참조 자체를 통해 읽기 및 쓰기 액세스를 모두 제공하므로 이 수정이 필요합니다. 호출자는 별도의 setter 메서드 없이도 참조를 통해 값을 직접 수정할 수 있습니다. 접근자를 set 포함하면 동일한 스토리지를 수정하기 위한 두 가지 메커니즘이 생성되며 이는 중복되며 어떤 수정 경로를 사용해야 하는지 혼동할 수 있습니다.

자세한 내용은 ref 반환 및 ref 지역 및속성을 참조하세요.