C# 컴파일러는 레코드 형식을 오용할 때 오류 및 경고를 생성합니다. 레코드 형식은 값 기반 같음을 구현하는 기본 제공 멤버를 제공합니다. 이러한 진단은 레코드 형식을 선언하고 사용하는 규칙을 따르는 데 도움이 됩니다.
- CS8851: 'type'은 'Equals'를 정의하지만 'GetHashCode'는 정의하지 않습니다.
-
CS8857: 식의 수신자는
withvoid가 아닌 형식이어야 합니다. - CS8858: 수신기 형식 'type'은 유효한 레코드 형식이 아니며 구조체 형식이 아닙니다.
- CS8859: 'Clone'이라는 멤버는 레코드에서 허용되지 않습니다.
- CS8860: 형식 및 별칭의 이름은 'record'로 지정하면 안 됩니다.
- CS8864: 레코드는 개체 또는 다른 레코드에서만 상속할 수 있습니다.
- CS8865: 오직 레코드만이 레코드로부터 상속받을 수 있습니다.
- CS8866: 위치 매개 변수 'parameter'에 일치하려면 레코드 멤버 'member'가 읽을 수 있는 인스턴스 속성 또는 'type' 형식의 필드여야 합니다.
- CS8869: 'member'는 'object'에서 예상된 메서드를 재정의하지 않습니다.
- CS8870: 포함된 레코드가 봉인되지 않으므로 'member'를 봉인할 수 없습니다.
- CS8871: 'member'는 'type'에서 예상된 메서드를 재정의하지 않습니다.
- CS8872: 포함된 레코드가 봉인되지 않았기 때문에 '멤버'는 재정의를 허용해야 합니다.
- CS8873: 레코드 멤버 'member'는 public이어야 합니다.
- CS8874: 레코드 멤버 'member'는 'type'을 반환해야 합니다.
- CS8875: 레코드 멤버 'member'를 보호해야 합니다.
- CS8876: 'member'는 'type'에서 예상 속성을 재정의하지 않습니다.
- CS8877: 레코드 멤버 'member'가 정적이지 않을 수 있습니다.
- CS8879: 레코드 멤버 'member'는 프라이빗이어야 합니다.
- CS8906: 레코드 동등성 계약 속성 'member'에는 get 접근자가 있어야 합니다.
- CS8908: 레코드 필드에 'type' 형식을 사용할 수 없습니다.
- CS8913: 이 매개 변수에 해당하는 위치 멤버 'member'가 숨겨집니다.
또한 이 문서에서는 다음 경고를 다룹니다.
- CS8907: 매개 변수 'name'을 읽지 않았습니다. 해당 이름을 사용하여 속성을 초기화하는 데 사용하는 것을 잊셨나요?
합성 멤버 서명
- CS8869: 'member'는 'object'에서 예상된 메서드를 재정의하지 않습니다.
- CS8870: 포함된 레코드가 봉인되지 않으므로 'member'를 봉인할 수 없습니다.
- CS8871: 'member'는 'type'에서 예상된 메서드를 재정의하지 않습니다.
- CS8872: 포함하는 레코드가 봉인되지 않았으므로 '멤버'는 재정의를 허용해야 합니다.
- CS8873: 레코드 멤버 'member'는 public이어야 합니다.
- CS8874: 레코드 멤버 'member'는 'type'을 반환해야 합니다.
- CS8875: 레코드 멤버 'member'는 보호되어야 합니다.
- CS8876: 'member'는 'type'에서 예상 속성을 재정의하지 않습니다.
- CS8877: 레코드 멤버 'member'가 정적이지 않을 수 있습니다.
- CS8879: 레코드 멤버 'member'는 프라이빗이어야만 합니다.
- CS8906: 레코드 동등성 계약 속성 'member'에는 get 접근자가 있어야 합니다.
컴파일러가 레코드 형식에 대해 합성할 멤버를 명시적으로 선언할 때, 당신의 선언은 예상된 시그니처, 접근성 수준 및 한정자와 일치해야 합니다. 전체 규칙은 C# 언어 사양의 레코드 사양 을 참조하세요.
이러한 오류를 수정하려면 명시적으로 선언된 레코드 멤버에 다음 변경 내용을 적용합니다.
- 메서드
Equals,GetHashCode, deconstruct 메서드,ToString속성이나EqualityContract및op_Equality연산자의 접근성을op_Inequality으로 변경public합니다. 컴파일러는 모든 호출 컨텍스트(CS8873)에서 값 기반 같음이 올바르게 작동하도록 이러한 멤버에 공개적으로 액세스할 수 있어야 합니다. - 메서드
PrintMembers의 접근성을protected봉인되지 않은 레코드 클래스에서 선언할 때로 변경합니다. 메서드는 파생 레코드가 형식이 지정된 출력(protected)에 자체 속성을 포함하도록 재정의하기 때문에 CS8875를 사용해야 합니다. - 메서드
PrintMembers의 접근성을private봉인된 레코드 클래스 또는 레코드 구조체에서 선언할 때로 변경합니다. 파생 형식이 없으므로 형식 외부에서 메서드에 액세스할 필요가 없습니다(CS8879). - 명시적으로 선언된 합성 멤버에서
static수정자를 제거합니다. 합성 멤버는 같음 비교, 서식 지정 및 복사와 같은 동작을 구현하기 위해 특정 레코드 인스턴스에서 작동하므로 인스턴스 멤버(CS8877)여야 합니다. - 컴파일러에서 예상하는 형식과 일치하도록 멤버의 반환 형식을 변경합니다. 예를 들어 속성은
EqualityContract반환System.Type해야 하며 메서드는Equals반환bool해야 합니다. 컴파일러는 이러한 정확한 반환 형식을 사용하여 일치성 및 기타 합성된 동작(CS8874)에 대한 올바른 코드를 생성합니다. -
sealed봉인되지 않은 레코드에서 명시적으로 선언된 합성 멤버에서 한정자를 제거합니다. 파생 레코드는 이러한 멤버를 재정의하여 고유한 값 기반 같음 및 서식 지정 논리(CS8870)를 제공할 수 있어야 합니다. - 봉인되지 않은 레코드에서 명시적으로 제공된 합성 멤버를
virtual또는override로 선언합니다. 컴파일러는 상속 계층의 파생 레코드가 해당 동작을 사용자 지정할 수 있도록 이러한 멤버가 재정의를 허용해야 합니다(CS8872). - 명시적으로 선언된 멤버가
object또는 기본 레코드 형식에서 예상되는 메서드를 재정의하는지 확인합니다. 예를 들어Equals메서드는object.Equals를 재정의해야 하며,GetHashCode는object.GetHashCode를 재정의해야 합니다. 컴파일러는 값 기반 동일성 및 기타 생성된 동작이 형식 계층 구조(CS8869, CS8871)에서 올바르게 작동하도록 이러한 멤버가 올바른 재정의 체계에 참여하는지 확인합니다. - 명시적으로 선언된
EqualityContract속성이 기본 레코드의EqualityContract속성을 재정의하도록 해야 합니다. 컴파일러는 상속 계층 구조 (CS8876) 내에서 런타임에 레코드 형식을 구분하기 위해 동등성 계약의 재정의 체인을 사용합니다. - 속성
EqualityContract에get접근자를 추가합니다. 컴파일러는 런타임에 같음 계약을 읽어 두 레코드 인스턴스가 동일한 형식인지 확인하므로 속성을 읽을 수 있어야 합니다(CS8906).
위치 멤버
- CS8866: 위치 매개 변수 'parameter'에 일치하려면 레코드 멤버 'member'가 읽을 수 있는 인스턴스 속성 또는 'type' 형식의 필드여야 합니다.
- CS8907: 매개 변수 'name'을 읽지 않았습니다. 해당 이름을 사용하여 속성을 초기화하는 데 사용하는 것을 잊셨나요?
- CS8908: 레코드 필드에 'type' 형식을 사용할 수 없습니다.
- CS8913: 이 매개 변수에 해당하는 위치 멤버 'member'가 숨겨집니다.
위치 레코드를 선언하면 컴파일러는 각 위치 매개 변수에 해당하는 속성을 합성합니다. 이러한 진단은 명시적 선언이 합성된 속성과 충돌함을 나타냅니다. 전체 규칙은 C# 언어 사양의 레코드 사양 을 참조하세요.
이러한 오류를 수정하려면 위치 레코드 선언에 다음 변경 내용을 적용합니다.
- 위치 매개 변수에 해당하는 명시적으로 선언된 멤버를 변경하여 매개 변수와 형식이 같은 읽기 가능한 인스턴스 속성 또는 필드가 되도록 합니다. 컴파일러는 합성된
Deconstruct메서드와 위치 패턴 일치 가 값에 올바르게 액세스할 수 있도록 멤버를 읽을 수 있고 형식과 호환되어야 합니다(CS8866). - 명시적 생성자를 제공할 때 각 위치 매개 변수가 생성자 본문에서 해당 속성을 초기화해야 합니다. 일반적으로 매개 변수 이름과 속성 이름 사이에 오타 또는 불일치를 나타내므로 매개 변수가 사용되지 않을 때 컴파일러가 경고를 발생합니다. 그러면 속성이 초기화되지 않습니다(CS8907).
- 레코드에 선언된 필드의 형식을 해당 컨텍스트에서 유효한 형식으로 변경합니다. 레코드 형식은 모든 필드가 힙 할당 및 값 기반 같음(
Span<T>)과 호환되어야 하므로 레코드에서 특정 형식(예:ref struct다른 형식)을 필드로 사용할 수 없습니다. -
new기본 레코드의 위치 멤버를 숨기는 파생 레코드의 멤버에서 수정자를 제거합니다. 위치 멤버가 숨겨지면 컴파일러가 해당 속성과 위치 매개 변수를 일치시킬 수 없으므로 합성된Deconstruct메서드와 위치 패턴 일치 (CS8913)가 중단됩니다.
같음 멤버
- CS8851: 'type'은 'Equals'를 정의하지만 'GetHashCode'는 정의하지 않습니다.
-
CS8857: 식의 수신자는
withvoid가 아닌 형식이어야 합니다. - CS8858: 수신기 형식 'type'은 유효한 레코드 형식이 아니며 구조체 형식이 아닙니다.
레코드 형식은 기본 제공 값 기반 동등성을 제공합니다. 선언이 동등성 계약과 충돌할 때 이러한 진단이 발생합니다. 같음의 전체 규칙은 같음 비교를 참조하세요.
이러한 오류를 수정하려면 다음 변경 내용을 적용합니다.
- 각
GetHashCode메서드를 정의할 때마다Equals메서드를 추가합니다. 같음 계약에는 동일한 것으로 간주되는 개체가 동일한 해시 코드를 생성해야 하므로 컴파일러는 이러한 두 메서드가 항상 함께 정의되도록 적용합니다(CS8851). -
with또는 구조체 형식이 되도록 식의 수신기 를 변경합니다.with식은record복사 생성자를 사용하여 수정된 복사본을 만들거나,struct형식에 대한 값 복사 의미 체계(CS8858)를 사용하여 만듭니다. - 식의 수신기에
withvoid가 아닌 형식이 있는지 확인합니다. 이 식은with수신기의 새 복사본을 생성하므로 수신기는 복사할 수 있는 값(CS8857)으로 평가해야 합니다.
레코드 상속
- CS8864: 레코드는 개체 또는 다른 레코드에서만 상속할 수 있습니다.
- CS8865: 레코드만 레코드로부터 상속할 수 있습니다.
레코드 클래스 형식 은 특정 상속 규칙을 따릅니다. 전체 규칙은 C# 언어 사양의 레코드 사양 을 참조하세요.
이러한 오류를 수정하려면 다음 변경 내용을 적용합니다.
- 레코드 클래스의 기본 형식을
object또는 다른 레코드 클래스에서 상속받도록 변경합니다. 레코드 형식은 다른 레코드 형식과만 호환되는 같음 및 복사를 위해 컴파일러 합성 멤버를 사용하므로 컴파일러는 레코드가 비 레코드 클래스(CS8864)에서 상속되는 것을 허용하지 않습니다. - 대신 레코드 클래스로 선언되도록 레코드 클래스에서 상속되는 레코드가 아닌 클래스를 변경합니다. 레코드 형식은 같음, 복제 및 일관된 상속 체인에 의존하는 다른 멤버를 합성하므로 컴파일러는 계층의 모든 형식이 레코드 클래스(CS8865)가 되어야 합니다. 레코드 구조체 형식은 인터페이스 구현 외에 상속 계층 구조에 참여할 수 없습니다.
예약 멤버 이름
- CS8859: 'Clone'이라는 멤버는 레코드에서 허용되지 않습니다.
- CS8860: 형식 및 별칭의 이름은 'record'로 지정하면 안 됩니다.
컴파일러는 레코드 형식에 사용할 특정 이름을 예약합니다. 전체 규칙은 C# 언어 사양의 레코드 사양 을 참조하세요.
이러한 오류를 수정하려면 다음 변경 내용을 적용합니다.
.NET