배열 및 컬렉션 선언과 초기화 식의 오류 및 경고 해결
이 문서에서는 다음 컴파일러 오류를 다룹니다.
- 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개의 인덱스를 지정해야 합니다. 배열에 3차원이 있는 경우 3개의 인덱스를 지정해야 합니다.
- 모든 인덱스는 음수가 아닌 정수여야 합니다.
잘못된 배열 순위
- CS0178: 잘못된 순위 지정자: '
,
' 또는 ']
'가 필요합니다. - CS0650: 배열 선언자가 잘못되었습니다. 관리되는 배열을 선언하려면 차수 지정자가 변수 식별자보다 앞에 와야 합니다. 고정 크기 버퍼 필드를 선언하려면 fixed 키워드를 필드 형식 앞에 사용하세요.
- CS1552: 배열 형식 지정자
[]
은 매개 변수 이름 앞에 나타나야 합니다.
배열 선언은 다음 토큰으로 순서대로 구성됩니다.
- 배열 요소의 형식입니다. 예를 들어
int
,string
또는SomeClassType
입니다. - 다차원을 나타내기 위해 선택적으로 쉼표를 포함하는 배열 대괄호입니다.
- 변수 이름입니다.
파스칼식 대/소문자가 배열 차원을 지정하는 경우 다음 속성을 지정할 수 있습니다.
- 중괄호(
{
및}
) 안의 여러 요소 - 빈 괄호
- 대괄호로 묶인 하나 이상의 쉼표
예를 들어, 다음은 유효한 배열 선언입니다.
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.TypedReference 및 System.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 규격에 대한 자세한 내용은 언어 독립성 및 언어 독립적 구성 요소를 참조하세요.
.NET
피드백
https://aka.ms/ContentUserFeedback을 참조하세요.
출시 예정: 2024년 내내 콘텐츠 피드백 메커니즘인 GitHub 문제를 단계적으로 폐지하고 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은다음에 대한 사용자 의견 제출 및 보기