영어로 읽기

다음을 통해 공유


ref struct 형식과 관련된 오류 및 경고

  • CS8343: ref structs 인터페이스를 구현할 수 없습니다.
  • CS8344: foreach 문은 형식이 ref struct를 허용하는 ref struct 또는 형식 매개 변수이므로 비동기 또는 반복기 메서드의 열거자에서 작동할 수 없습니다.
  • CS8345: 필드 또는 자동 구현 속성은 ref struct의 인스턴스 멤버인 경우 외에는 형식일 수 없습니다.
  • CS9048: scoped 한정자는 ref 및 ref struct 값에만 사용할 수 있습니다.
  • CS9050: ref 필드는 ref struct를 참조할 수 없습니다.
  • CS9059: ref 필드는 ref struct에서만 선언할 수 있습니다.
  • CS9241: 'ref struct'가 이미 지정되었습니다.
  • CS9242: 'allows' 제약 조건 절은 마지막으로 지정된 제약 조건이어야 합니다.
  • CS9243: 다른 제약 조건에서 클래스로 알려진 형식 매개 변수에 대한 ref struct를 허용할 수 없습니다.
  • CS9244: 형식은 ref struct가 아니거나 제네릭 형식이나 메서드에서 매개 변수로 사용하기 위해 ref struct를 허용하는 형식 매개 변수가 될 수 없습니다.
  • CS9245: 형식이 ref struct 형식에 대한 인터페이스 멤버를 구현할 수 없습니다.
  • CS9246: ref struct를 허용하는 형식 매개 변수에서 비가상 인스턴스 인터페이스 멤버에 액세스할 수 없습니다.
  • CS9247: foreach 문은 ref struct를 허용하는 형식 매개 변수이고 컴파일 시간에 IDisposable을 구현하는 방법을 알 수 없기 때문에 형식의 열거자에서 작동할 수 없습니다.
  • CS9267: 반복기의 요소 형식이 ref 구조체 또는 ref 구조체를 허용하는 형식 매개 변수가 아닐 수 있습니다.

ref 안전 위반

  • CS8345: 필드 또는 자동 구현 속성은 ref struct의 인스턴스 멤버인 경우 외에는 형식일 수 없습니다.
  • CS9048: scoped 한정자는 ref 및 ref struct 값에만 사용할 수 있습니다.
  • CS9050: ref 필드는 ref struct를 참조할 수 없습니다.
  • CS9059: ref 필드는 ref struct에서만 선언할 수 있습니다.

ref struct 형식에는 ref 필드가 포함될 수 있습니다. 다른 형식은 허용된 ref 필드가 아닙니다. 컴파일러는 ref struct 형식의 인스턴스에 ref 안전 규칙을 적용하기 위해 ref struct 형식의 선언 및 사용에 제한을 적용합니다.

  • 형식만 ref struct 자동으로 구현된 속성을 포함할 ref 수 있습니다.
  • ref struct 형식 또는 ref 변수만 scoped 한정자를 가질 수 있습니다.
  • ref 필드는 ref struct 형식에서만 선언될 수 있습니다.
  • ref 필드는 ref struct 형식을 참조할 수 없습니다.

이러한 규칙 중 하나라도 위반하면 나열된 오류 중 하나가 발생합니다. 해당 언어 기능을 사용하려는 경우 해당 형식을 ref struct로 변환합니다. 그렇지 않으면 허용되지 않는 구문을 제거합니다.

ref struct 인터페이스 구현

  • CS8343: ref structs는 인터페이스를 구현할 수 없습니다.
  • CS8344: foreach 문은 형식이 ref struct를 허용하는 ref struct 또는 형식 매개 변수이므로 비동기 또는 반복기 메서드의 열거자에서 작동할 수 없습니다.
  • CS9241: 'ref struct'가 이미 지정되었습니다.
  • CS9242: 'allows' 제약 조건 절은 마지막으로 지정된 제약 조건이어야 합니다.
  • CS9243: 다른 제약 조건에서 클래스로 알려진 형식 매개 변수에 대한 ref struct를 허용할 수 없습니다.
  • CS9244: 형식은 ref struct가 아니거나 제네릭 형식이나 메서드에서 매개 변수로 사용하기 위해 ref struct를 허용하는 형식 매개 변수가 될 수 없습니다.
  • CS9245: 형식이 ref struct 형식에 대한 인터페이스 멤버를 구현할 수 없습니다.
  • CS9246: ref struct를 허용하는 형식 매개 변수에서 비가상 인스턴스 인터페이스 멤버에 액세스할 수 없습니다.
  • CS9247: foreach 문은 ref struct를 허용하는 형식 매개 변수이고 컴파일 시간에 IDisposable을 구현하는 방법을 알 수 없기 때문에 형식의 열거자에서 작동할 수 없습니다.
  • CS9267: 반복기의 요소 형식이 ref 구조체 또는 ref 구조체를 허용하는 형식 매개 변수가 아닐 수 있습니다.

C# 13 이전에는 ref struct 형식이 인터페이스를 구현할 수 없었습니다. 컴파일러는 CS8343을 생성합니다. C# 13부터 ref struct 형식은 다음 규칙에 따라 인터페이스를 구현할 수 있습니다.

  • ref struct는 자신이 구현하는 인터페이스의 인스턴스로 변환될 수 없습니다. 이 제한에는 매개 변수가 인터페이스 형식인 경우 ref struct 형식을 인수로 사용할 때의 암묵적 변환이 포함됩니다. 이 변환은 ref 안전을 위반하는 boxing 변환으로 이어집니다.
  • 인터페이스 를 구현하는 ref struct는 모든 인터페이스 멤버를 구현해야 합니다. ref struct는 인터페이스에 기본 구현이 포함된 멤버를 구현해야 합니다.

C# 13부터 ref struct를 제네릭 형식 매개 변수의 형식 인수로 사용할 수 있습니다. 단, 제네릭 형식 매개 변수에 allows ref struct 안티 제약 조건이 있는 경우에만 가능합니다. allows ref struct 안티 제약 조건을 사용하는 경우 다음 규칙을 따라야 합니다.

  • ref struct가 형식 인수로 사용되고 형식 매개 변수 는 반드시 allows ref struct 안티 제약 조건을 가져야 합니다. - allows ref struct 안티 제약 조건은 해당 매개 변수에 대한 where 절의 마지막에 있어야 합니다.
  • 인스턴스를 사용하는 경우 형식 매개 변수는 ref 안전 규칙을 따라야 합니다.
  • 형식일 수 있는 A ref struct 또는 형식 인수는 ref struct 반복기 메서드의 요소 형식으로 사용할 수 없습니다.