다음을 통해 공유


인라인 배열 선언을 사용하여 오류 및 경고 해결

이 문서에서는 다음 컴파일러 오류 및 경고를 설명합니다.

  • CS9164: 식은 할당 가능한 변수가 아니므로 Span<T>(으)로 변환할 수 없습니다.
  • CS9165: 식은 참조로 전달되거나 반환될 수 없으므로 ReadOnlySpan<T>(으)로 변환할 수 없습니다.
  • CS9166: 인덱스가 인라인 배열의 범위를 벗어났습니다.
  • CS9167: 인라인 배열 길이는 0보다 커야 합니다.
  • CS9168: 인라인 배열 구조체에는 명시적 레이아웃이 없어야 합니다.
  • CS9169: 인라인 배열 구조체는 ref 필드가 아니어야 하는 하나의 인스턴스 필드만 선언해야 합니다.
  • CS9172: 인라인 배열 형식의 요소는 암시적으로 int, System.Index 또는 System.Range(으)로 변환할 수 있는 단일 인수를 통해서만 액세스할 수 있습니다.
  • CS9173: 배열 액세스에는 명명된 인수 지정자를 사용할 수 없습니다.
  • CS9180: 인라인 배열 요소 필드는 필수, 읽기 전용, 휘발성 또는 고정 크기 버퍼로 선언할 수 없습니다.
  • CS9181: 인라인 배열 인덱서는 요소 액세스 식에 사용되지 않습니다.
  • CS9182: 인라인 배열 'Slice' 메서드는 요소 액세스 식에 사용되지 않습니다.
  • CS9183: 인라인 배열 변환 연산자는 선언 형식 식에서 변환하는 데 사용되지 않습니다.
  • CS9184: 'ref' 필드인 요소 필드가 있거나 형식 인수로 유효하지 않은 형식이 있는 인라인 배열 형식에 대해서는 '인라인 배열' 언어 기능이 지원되지 않습니다.
  • CS9189: 형식의 인라인 배열에 대한 foreach 문은 지원되지 않습니다.
  • CS9259: 레코드 구조체에 특성을 System.Runtime.CompilerServices.InlineArrayAttribute 적용할 수 없습니다.

인라인 배열 선언

인라인 배열은 단일 필드가 있는 struct 형식과 배열의 길이를 지정하는 특성으로 선언됩니다. 컴파일러는 잘못된 인라인 배열 선언에 대해 다음 오류를 생성합니다.

  • CS9167: 인라인 배열 길이는 0보다 커야 합니다.
  • CS9168: 인라인 배열 구조체에는 명시적 레이아웃이 없어야 합니다.
  • CS9169: 인라인 배열 구조체는 ref 필드가 아니어야 하는 하나의 인스턴스 필드만 선언해야 합니다.
  • CS9180: 인라인 배열 요소 필드는 필수, 읽기 전용, 휘발성 또는 고정 크기 버퍼로 선언할 수 없습니다.
  • CS9184: 'ref' 필드인 요소 필드가 있거나 형식 인수로 유효하지 않은 형식이 있는 인라인 배열 형식에 대해서는 '인라인 배열' 언어 기능이 지원되지 않습니다.
  • CS9259: 레코드 구조체에 특성을 System.Runtime.CompilerServices.InlineArrayAttribute 적용할 수 없습니다.

이러한 배열을 수정하려면 다음이 true인지 확인합니다.

  • System.Runtime.CompilerServices.InlineArrayAttribute 인수가 양의 정수입니다.
  • 바깥쪽 struct이(가) 명시적 레이아웃을 지정하지 않습니다.
  • 바깥쪽 struct에 단일 인스턴스 필드가 있으며 해당 인스턴스 필드가 ref 필드가 아닙니다.
  • 단일 인스턴스 필드가 고정 크기 버퍼가 아닙니다.
  • 단일 인스턴스 필드에 required, volatile, 또는 readonly 한정자가 포함되어 있지 않습니다.
  • record 라인 배열 선언에서 한정자를 제거합니다.

요소 액세스

모든 배열과 동일한 방식으로 인라인 배열의 요소에 액세스합니다. 컴파일러는 잘못된 요소 액세스로부터 다음 오류를 내보냅니다.

  • CS9166: 인덱스가 인라인 배열의 범위를 벗어났습니다.
  • CS9172: 인라인 배열 형식의 요소는 암시적으로 int, System.Index 또는 System.Range(으)로 변환할 수 있는 단일 인수를 통해서만 액세스할 수 있습니다.
  • CS9173: 배열 액세스에는 명명된 인수 지정자를 사용할 수 없습니다.
  • CS9189: 형식의 인라인 배열에 대한 foreach 문은 지원되지 않습니다.

또한 인덱서를 선언하면 컴파일러가 다음 경고를 발생합니다.

  • CS9181: 인라인 배열 인덱서는 요소 액세스 식에 사용되지 않습니다.

인라인 버퍼에 대해 생성된 코드는 선언된 인덱서를 우회하여 버퍼 메모리에 직접 액세스합니다. 인라인 배열은 foreach 문과 함께 사용할 수 없습니다.

인덱서에 대한 인수는 다음과 같아야 합니다.

  • int, System.Index 또는 System.Range 유형 중 하나이어야 합니다.
  • 명명된 인수일 수 없습니다. 컴파일러는 요소 접근자를 생성합니다. 매개 변수에는 이름이 없으며, 따라서 명명된 인수를 사용할 수 없습니다.
  • 배열의 범위에 포함됩니다. 모든 .NET 배열과 마찬가지로 인라인 배열 요소 액세스는 경계를 확인합니다. 인덱스는 인라인 배열의 범위 내에 있어야 합니다.

범위로 변환

인라인 배열 작업에서 System.Span<T> 또는 System.ReadOnlySpan<T>을(를) 사용하는 경우가 많습니다. 컴파일러는 잘못된 변환에 대해 다음 오류를 생성합니다.

  • CS9164: 식은 할당 가능한 변수가 아니므로 Span<T>(으)로 변환할 수 없습니다.
  • CS9165: 식은 참조로 전달되거나 반환될 수 없으므로 ReadOnlySpan<T>(으)로 변환할 수 없습니다.

컴파일러는 인라인 버퍼 메모리에 직접 액세스하는 코드를 생성합니다. 따라서 일부 멤버는 호출되지 않습니다. 호출되지 않은 멤버 중 하나를 작성하면 컴파일러에서 다음 경고를 생성합니다.

  • CS9182: 인라인 배열 'Slice' 메서드는 요소 액세스 식에 사용되지 않습니다.
  • CS9183: 인라인 배열 변환 연산자는 선언 형식 식에서 변환하는 데 사용되지 않습니다.

인라인 배열을 암시적으로 Span<T> 또는 ReadOnlySpan<T>(으)로 변환하여 인라인 배열을 메서드에 전달할 수 있습니다. 컴파일러는 이러한 변환에 제한을 적용합니다.

  • 인라인 배열을 Span<T>(으)로 변환하려면 인라인 배열이 쓰기가 가능해야 합니다. 배열이 읽기 전용인 경우 쓰기 가능한 Span<T>(으)로 변환할 수 없습니다. 대신 ReadOnlySpan<T>을(를) 사용할 수 있습니다.
  • 변환이 성공하려면 인라인 배열의 안전한 컨텍스트Span<T> 또는ReadOnlySpan<T>안전한 컨텍스트 너비 이상이어야 합니다. 범위의 컨텍스트를 제한하거나 인라인 배열의 범위를 확장해야 합니다.

또한 컴파일러는 인라인 버퍼에서 Slice 메서드에 대한 호출을 생성하지 않습니다. 인라인 버퍼를 Span 또는 ReadOnlySpan(으)로 변환하는 변환 연산자는 호출되지 않습니다. 컴파일러는 메모리 버퍼에서 직접 System.Span<T> 또는 System.ReadOnlySpan<T>을(를) 만드는 코드를 생성합니다.