배열 및 컬렉션 선언과 초기화 식의 오류 및 경고 해결

이 문서에서는 다음 컴파일러 오류를 다룹니다.

  • CS0022: [] 내부의 인덱스 개수가 잘못되었습니다. 'number'개가 필요합니다.
  • CS0178: 잘못된 순위 지정자: ',' 또는 ']'가 필요합니다.
  • CS0248: 음수 크기의 배열을 만들 수 없습니다.
  • CS0270: 변수 선언에서 배열 크기를 지정할 수 없습니다('new' 식으로 초기화하세요).
  • CS0611: 배열 요소는 형식일 수 없습니다.
  • CS0623: 배열 이니셜라이저는 변수 또는 필드 이니셜라이저에서만 사용할 수 있습니다. 대신 새 식을 사용해 봅니다.
  • CS0650: 배열 선언자가 잘못되었습니다. 관리되는 배열을 선언하려면 차수 지정자가 변수 식별자보다 앞에 와야 합니다. 고정 크기 버퍼 필드를 선언하려면 fixed 키워드를 필드 형식 앞에 사용하세요.
  • CS0719: 배열 요소는 정적 형식일 수 없습니다.
  • CS0747: 잘못된 이니셜라이저 멤버 선언자입니다.
  • CS0820: 암시적으로 형식이 할당된 로컬에 배열 이니셜라이저를 할당할 수 없습니다.
  • CS0826: 암시적으로 형식이 지정된 배열에 가장 적합한 형식을 찾을 수 없습니다.
  • CS0846: 중첩 배열 이니셜라이저가 필요합니다.
  • CS1552: 배열 형식 지정자 []은 매개 변수 이름 앞에 나타나야 합니다.
  • CS1586: 배열 만들기에는 배열 크기 또는 배열 이니셜라이저가 있어야 합니다.
  • CS1920: 요소 이니셜라이저는 비워둘 수 없습니다.
  • CS1921: 최상의 오버로드된 메서드 일치에 이니셜라이저 요소에 대한 서명이 잘못되었습니다. 초기화 가능한 Add는 액세스 가능한 인스턴스 메서드여야 합니다.
  • CS1925: 컬렉션 이니셜라이저로 'type' 형식의 개체를 초기화할 수 없습니다.
  • CS1954: 컬렉션 이니셜라이저 요소에 대해 가장 잘 일치하는 오버로드된 메서드를 사용할 수 없습니다. 컬렉션 이니셜라이저 'Add' 메서드에는 ref 또는 out 매개 변수가 있을 수 없습니다.
  • CS9174: 형식이 생성 가능하지 않기 때문에 컬렉션 리터럴로 형식을 초기화할 수 없습니다.
  • CS9176: 컬렉션 리터럴에 대한 대상 유형이 없습니다.
  • CS9185: CollectionBuilderAttribute 빌더 형식은 일반이 아닌 클래스 또는 구조체여야 합니다.
  • CS9186: CollectionBuilderAttribute 메서드 이름이 잘못되었습니다.
  • CS9187: 예상 서명이 있는 액세스 가능한 메서드를 찾을 수 없습니다. ReadOnlySpan<T> 형식의 단일 매개 변수가 있는 정적 메서드입니다. 올바른 반환 형식
  • CS9188: 형식에 CollectionBuilderAttribute가 있지만 요소 형식이 없습니다.
  • CS9203: 이 형식의 컬렉션 식은 현재 범위 외부에 노출될 수 있으므로 이 컨텍스트에서 사용할 수 없습니다.
  • CS9210: 이 버전의 System.Collections.Immutable.ImmutableArray<T>는 컬렉션 식과 함께 사용할 수 없습니다.

또한 이 문서에서는 다음 경고를 다룹니다.

  • CS3007: 명명되지 않은 배열 형식만 다른 오버로드된 'method' 메서드는 CLS 규격이 아닙니다.
  • CS3016: 특성 인수인 배열은 CLS를 준수하지 않습니다.
  • CS0251: 음수 인덱스를 사용하여 배열을 인덱싱했습니다. 배열 인덱스는 항상 0부터 시작합니다.
  • CS9208: 컬렉션 식으로 인해 예기치 않은 힙 할당이 발생할 수 있습니다. 명시적으로 배열을 만든 다음 최종 형식으로 변환하여 할당을 명시적으로 만드는 것이 좋습니다.
  • CS9209: '..' 스프레드 사용으로 인해 컬렉션 식에서 예기치 않은 힙 할당이 발생할 수 있습니다. 명시적으로 배열을 만든 다음 최종 형식으로 변환하여 할당을 명시적으로 만드는 것이 좋습니다.

다음 문서에서 배열, 컬렉션 이니셜라이저 및 컬렉션 식에 대해 자세히 알아볼 수 있습니다.

잘못된 컬렉션 이니셜라이저

다음 오류는 컬렉션 이니셜라이저에 대해 컴파일러가 생성한 코드가 유효하지 않음을 나타냅니다.

  • CS0747: 잘못된 이니셜라이저 멤버 선언자입니다.
  • CS1920: 요소 이니셜라이저는 비워둘 수 없습니다.
  • CS1921: 최상의 오버로드된 메서드 일치에 이니셜라이저 요소에 대한 서명이 잘못되었습니다. 초기화 가능한 Add는 액세스 가능한 인스턴스 메서드여야 합니다.
  • CS1954: 컬렉션 이니셜라이저 요소에 대해 가장 잘 일치하는 오버로드된 메서드를 사용할 수 없습니다. 컬렉션 이니셜라이저 'Add' 메서드는 ref 또는 out 매개 변수를 가질 수 없습니다.
  • CS9174: 형식이 생성 가능하지 않기 때문에 컬렉션 리터럴로 형식을 초기화할 수 없습니다.
  • CS9176: 컬렉션 리터럴에 대한 대상 유형이 없습니다.
  • CS9203: 이 형식의 컬렉션 식은 현재 범위 외부에 노출될 수 있으므로 이 컨텍스트에서 사용할 수 없습니다.
  • CS9210: 이 버전의 System.Collections.Immutable.ImmutableArray<T>는 컬렉션 식과 함께 사용할 수 없습니다.

컴파일러는 다음 경고를 생성할 수도 있습니다.

  • CS9208: 컬렉션 식으로 인해 예기치 않은 힙 할당이 발생할 수 있습니다. 명시적으로 배열을 만든 다음 최종 형식으로 변환하여 할당을 명시적으로 만드는 것이 좋습니다.
  • CS9209: '..' 스프레드 사용으로 인해 컬렉션 식에서 예기치 않은 힙 할당이 발생할 수 있습니다. 명시적으로 배열을 만든 다음 최종 형식으로 변환하여 할당을 명시적으로 만드는 것이 좋습니다.

오류는 모두 컬렉션 이니셜라이저에 대해 컴파일러가 생성한 코드가 유효하지 않음을 나타냅니다. 다음을 확인하십시오.

  • 컬렉션 이니셜라이저에는 일련의 요소가 포함되어 있습니다. 컬렉션 인스턴스의 설정 속성을 동일한 이니셜라이저에 요소를 추가하는 것과 혼합할 수 없습니다.
  • 중괄호({})를 포함하는 컬렉션 이니셜라이저는 비워둘 수 없습니다.
  • 준수하는 Add 메서드는 액세스 가능해야 하며 컬렉션 요소와 동일한 형식의 매개 변수 하나를 사용해야 합니다. 매개 변수에는 ref 또는 out 한정자를 포함할 수 없습니다.
  • 오버로드 해결은 더 나은 일치 항목으로 하나의 Add 메서드를 선택해야 합니다. 똑같이 좋은 일치 방법은 여러 개 있을 수 없습니다.
  • 컬렉션 식은 컬렉션 형식의 명시적으로 형식화된 변수를 초기화할 수 있습니다. 변수가 컬렉션 또는 배열 형식이 아니거나 암시적으로 형식화된 경우(var 사용) 컬렉션 이니셜라이저를 사용할 수 없습니다.
  • System.Span<T>와 같은 ref struct 형식은 참조 안전성을 위반할 수 있는 컬렉션 식으로 초기화될 수 없습니다.
  • 컬렉션 식이 현재 버전을 사용하여 System.Collections.Immutable.ImmutableArray<T>를 올바르게 초기화할 수 없습니다. 다른 버전의 런타임을 사용하거나 초기화 식을 변경합니다.

경고는 확산 요소를 포함한 컬렉션 식이 메모리를 할당할 수 있음을 나타냅니다. 다른 스토리지를 만들고 변환하는 것이 더 효율적일 수 있습니다.

잘못된 배열 이니셜라이저

  • CS0623: 배열 이니셜라이저는 변수 또는 필드 이니셜라이저에서만 사용할 수 있습니다. 대신 새 식을 사용해 봅니다.
  • CS0846: 중첩 배열 이니셜라이저가 필요합니다.
  • CS1925: 컬렉션 이니셜라이저로 'type' 형식의 개체를 초기화할 수 없습니다.

이러한 오류는 잘못된 이니셜라이저를 만들었음을 나타냅니다. 가능한 원인은 하나 이상의 요소 또는 자식 배열 주위의 불균형한 중괄호 {}입니다. 초기화 식이 가변 배열 초기화의 배열 수와 일치하는지, 중괄호가 균형을 이루고 있는지 확인합니다.

잘못된 배열 요소 액세스

  • CS0022: [] 내부의 인덱스 개수가 잘못되었습니다. 'number'개가 필요합니다.
  • CS0251: 음수 인덱스를 사용하여 배열을 인덱싱했습니다. 배열 인덱스는 항상 0부터 시작합니다.

배열에 선언된 각 축의 인덱스를 지정하여 배열 요소에 액세스합니다. 인덱스는 배열 이름 뒤의 [] 사이에 있습니다. 배열 인덱스에는 두 가지 규칙이 있습니다.

  1. 배열 선언에 사용된 것과 동일한 수의 인덱스를 지정해야 합니다. 배열에 1차원이 있는 경우 1개의 인덱스를 지정해야 합니다. 배열에 3차원이 있는 경우 3개의 인덱스를 지정해야 합니다.
  2. 모든 인덱스는 음수가 아닌 정수여야 합니다.

잘못된 배열 순위

  • CS0178: 잘못된 순위 지정자: ',' 또는 ']'가 필요합니다.
  • CS0650: 배열 선언자가 잘못되었습니다. 관리되는 배열을 선언하려면 차수 지정자가 변수 식별자보다 앞에 와야 합니다. 고정 크기 버퍼 필드를 선언하려면 fixed 키워드를 필드 형식 앞에 사용하세요.
  • CS1552: 배열 형식 지정자 []은 매개 변수 이름 앞에 나타나야 합니다.

배열 선언은 다음 토큰으로 순서대로 구성됩니다.

  1. 배열 요소의 형식입니다. 예를 들어 int, string 또는 SomeClassType입니다.
  2. 다차원을 나타내기 위해 선택적으로 쉼표를 포함하는 배열 대괄호입니다.
  3. 변수 이름입니다.

파스칼식 대/소문자가 배열 차원을 지정하는 경우 다음 속성을 지정할 수 있습니다.

  • 중괄호({}) 안의 여러 요소
  • 빈 괄호
  • 대괄호로 묶인 하나 이상의 쉼표

예를 들어, 다음은 유효한 배열 선언입니다.

int[] anArrayOfIntegers;
string[,,] threeDimensionalStringArray;

자세한 내용은 배열 이니셜라이저에 대한 C# 사양(C# 언어 사양) 섹션을 참조하세요.

잘못된 배열 길이

  • CS0248: 음수 크기의 배열을 만들 수 없습니다.
  • CS0270: 변수 선언에는 배열 크기를 지정할 수 없습니다. ‘new’ 식을 사용하여 초기화하세요.
  • CS1586: 배열 만들기에는 배열 크기 또는 배열 이니셜라이저가 있어야 합니다.

배열의 각 차원 길이는 배열 선언이 아니라 파스칼식 대/소문자의 일부로 지정되어야 합니다. 각 차원의 길이는 양수여야 합니다. new 식을 사용하여 배열을 할당하거나 배열 이니셜라이저를 사용하여 모든 요소를 할당하여 길이를 할당할 수 있습니다. 다음 예에서는 두 가지 메커니즘을 모두 보여 줍니다.

int[] fiveIntegers = new int[5];
string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

잘못된 요소 형식

  • CS0611: 배열 요소는 'type' 형식일 수 없습니다.
  • CS0719: 배열 요소는 정적 형식일 수 없습니다.
  • CS0820: 암시적으로 형식이 할당된 로컬에 배열 이니셜라이저를 할당할 수 없습니다.
  • CS0826: 암시적으로 형식이 지정된 배열에 가장 적합한 형식을 찾을 수 없습니다.

일부 형식은 배열의 형식으로 사용할 수 없습니다. 이러한 형식에는 System.TypedReferenceSystem.ArgIterator가 포함됩니다. static 클래스의 인스턴스를 만들 수 없으므로 배열 형식은 static 클래스일 수 없습니다.

배열을 암시적으로 형식이 지정된 지역 변수로 선언할 수 있습니다. 배열은 new 식을 사용하여 초기화되어야 합니다. 또한 배열 이니셜라이저의 모든 요소에는 가장 일반적인 형식이 있어야 합니다. 다음 예에서는 암시적으로 형식화된 배열을 선언하는 방법을 보여 줍니다.

var implicitType = new[] { 1, 2, 3 };
        
char c = 'c';
short s1 = 0;
short s2 = -0;
short s3 = 1;
short s4 = -1;

// common type is "int"
var commonType = new[] { s1, s2, s3, s4, c, 1 };

다음 기술 중 하나를 사용하여 가장 일반적인 형식을 보장할 수 있습니다.

  • 배열에 명시적 형식을 지정합니다.
  • 모든 배열 요소에 동일한 형식을 지정합니다.
  • 문제를 일으킬 수 있는 요소에 명시적 캐스트를 지정합니다.

잘못된 컬렉션 작성기

다음 오류는 컬렉션 작성기 형식에 오류가 있음을 나타냅니다.

  • CS9185: CollectionBuilderAttribute 작성기 형식은 일반이 아닌 클래스 또는 구조체여야 합니다.
  • CS9186: CollectionBuilderAttribute 메서드 이름이 잘못되었습니다.
  • CS9187: 예상 서명이 있는 액세스 가능한 메서드를 찾을 수 없습니다. ReadOnlySpan<T> 형식의 단일 매개 변수가 있는 정적 메서드입니다. 반환 형식이 정확해야 합니다.
  • CS9188: 형식에 CollectionBuilderAttribute가 있지만 요소 형식이 없습니다.

이러한 오류는 컬렉션 작성기 형식을 수정해야 함을 나타냅니다. 다음 규칙에 주의해야 합니다.

  • 컬렉션 형식에는 반복 형식이 있어야 합니다. 즉, 형식을 컬렉션으로 foreach를 사용할 수 있습니다.
  • 컬렉션 작성기 형식은 제네릭 형식일 수 없습니다.
  • System.Runtime.CompilerServices.CollectionBuilderAttribute에 지정된 메서드 이름은 유효한 메서드 이름이어야 합니다. 예를 들어, 종료자 또는 잘못된 식별자 문자가 포함된 다른 이름일 수 없습니다.
  • 컬렉션 작성기 메서드는 액세스 가능한 정적 메서드여야 합니다. 컬렉션 형식을 반환해야 하며 ReadOnlySpan<T> 매개 변수를 가져와야 합니다. 여기서 T는 컬렉션의 요소 형식과 일치합니다.

공통 언어 사양 경고

  • CS3007: 명명되지 않은 배열 형식만 다른 오버로드된 'method' 메서드는 CLS 규격이 아닙니다.
  • CS3016: 특성 인수로서의 배열은 CLS를 준수하지 않습니다.

CS3007은 오버로드된 메서드에서 인수로 가변 배열을 사용하고 메서드 시그니처에서 배열의 요소 형식만 다른 경우에 발생합니다. 이 오류를 방지하려면 가변 배열 대신 직사각형 배열을 사용하는 것이 좋습니다. 또는 CLS 규정 준수가 필요하지 않은 경우 CLSCompliantAttribute 특성을 제거합니다. CLS 규격에 대한 자세한 내용은 언어 독립성 및 언어 독립적 구성 요소를 참조하세요.

CS3016은 배열을 특성에 전달하는 것이 CLS(공용 언어 사양)를 준수하지 않음을 나타냅니다. CLS 규격에 대한 자세한 내용은 언어 독립성 및 언어 독립적 구성 요소를 참조하세요.