C# 컴파일러는 잘못된 구문으로 문자열 리터럴을 선언하거나 지원되지 않는 컨텍스트에서 사용할 때 오류 및 경고를 생성합니다. 이러한 진단을 통해 기본 문자열 리터럴, 문자 리터럴, 원시 문자열 리터럴 및 UTF-8 문자열 리터럴과 관련된 문제를 식별할 수 있습니다.
- CS1009: 인식할 수 없는 이스케이프 시퀀스입니다.
- CS1010: 줄이 상수로 표시됩니다.
- CS1011: 빈 문자 리터럴입니다.
- CS1012: 문자 리터럴에 문자가 너무 많습니다.
- CS1039: 종료되지 않은 문자열 리터럴입니다.
- CS8996: 전처리기 지시문에서는 원시 문자열 리터럴이 허용되지 않습니다.
- CS8997: 확정되지 않은 원시 문자열 리터럴입니다.
- CS8998: 이 원시 문자열 콘텐츠에 대한 시작 따옴표가 충분하지 않습니다.
- CS8999: 줄은 원시 문자열 리터럴의 닫는 줄과 동일한 공백으로 시작되지 않습니다.
- CS9000: 원시 문자열 리터럴 구분 기호는 자체 줄에 있어야 합니다.
- CS9001: 다중 줄 원시 문자열 리터럴은 텍스트 그대로 보간된 문자열에서만 허용됩니다.
- CS9002: 여러 줄 원시 문자열 리터럴에는 하나 이상의 콘텐츠 줄이 포함되어야 합니다.
- CS9003: 줄에 예상과 다른 공백이 포함됩니다.
- CS9004: 원시 문자열 리터럴에 대한 따옴표가 충분하지 않습니다.
- CS9005: 보간된 원시 문자열 리터럴에 닫는 중괄호가 충분하지 않습니다.
- CS9006: 삽입된 원시 문자열 리터럴에 대해 중괄호를 너무 많이 열었습니다.
- CS9007: 보간된 원시 문자열 리터럴에 닫는 중괄호가 너무 많습니다.
- CS9008: '@' 문자 시퀀스는 허용되지 않습니다.
- CS9009: 문자열은 따옴표 문자로 시작해야 합니다.
- CS9026: 입력 문자열을 동등한 UTF-8 바이트 표현으로 변환할 수 없습니다.
- CS9047: 연산자는 UTF-8 바이트 표현이 아닌 피연산자에 적용할 수 없습니다.
- CS9274: 다른 문자열 리터럴과 XXHash128 충돌이 있으므로 이 문자열 리터럴을 데이터 섹션으로 내보낼 수 없습니다.
- CS9315: 프로그램에서 사용하는 사용자 문자열의 결합 길이가 허용된 제한을 초과합니다. 문자열 리터럴을 추가하려면 애플리케이션을 다시 시작해야 합니다.
잘못 구성된 문자열 리터럴
- CS1009 - 인식할 수 없는 이스케이프 시퀀스입니다.
- CS1010 - 상수 내의 줄바꿈.
- CS1011 - 빈 문자 리터럴입니다.
- CS1012 - 문자 리터럴에 문자가 너무 많습니다.
- CS1039 - 종료되지 않은 문자열 리터럴입니다.
이러한 오류를 수정하려면 다음 기술을 적용합니다.
- (줄 바꿈), (탭), (백슬래시)
\n또는\t(큰따옴표)(\\)와 같은\"C# 언어 사양에 정의된 표준 이스케이프 시퀀스 중 하나를 사용합니다. 컴파일러는 언어 사양의 일부가 아닌 이스케이프 시퀀스를 인식하지 못하므로 정의되지 않은 이스케이프 시퀀스를 사용하면 컴파일러에서 표시하려는 문자를 확인할 수 없기 때문에 이 오류가 발생합니다. - 문자열 리터럴(CS1039)을 완료하려면 닫는 따옴표 문자를 추가합니다. 문자열 리터럴에는 여는 구분 기호와 닫는 구분 기호가 모두 있어야 하므로 수정되지 않은 문자열로 인해 컴파일러가 후속 소스 코드를 문자열 콘텐츠의 일부로 처리하므로 구문 분석 오류가 발생합니다.
- 문자 리터럴의 작은따옴표 사이에 정확히 하나의 문자를 추가합니다(CS1011, CS1012). 문자 리터럴은 단일 문자 값을 나타내며 정확히 하나의 문자 또는 유효한 이스케이프 시퀀스를 포함해야 하므로 빈 문자 리터럴 또는 여러 문자를 포함하는 문자가 형식에 대한
char언어 규칙을 위반합니다. - 각 줄을 닫는 따옴표로 끝내고 다음 줄을 여는 따옴표로 시작하여 연산자를 사용하여
+여러 소스 줄에 걸쳐 있는 문자열 리터럴을 분할합니다(CS1010). 일반 문자열 리터럴은 여는 따옴표와 닫는 따옴표가 같은 줄에 있어야 하므로 실제 줄 바꿈 문자를 포함할 수 없습니다. 하지만 문자열 결합이나 문자열 내용에 줄 바꿈을 포함할 수 있는 축자 문자열 또는 원시 문자열 리터럴을 사용하여 여러 줄 문자열을 작성할 수 있습니다.
자세한 내용은 문자열을 참조하세요.
잘못된 형식의 원시 문자열 리터럴
- CS8996 - 원시 문자열 리터럴은 전처리기 지시문에서 허용되지 않습니다.
- CS8997 - 확정되지 않은 원시 문자열 리터럴입니다.
- CS8998 - 이 원시 문자열 콘텐츠에 대한 시작 따옴표가 충분하지 않습니다.
- CS8999 - 줄은 원시 문자열 리터럴의 닫는 줄과 동일한 공백으로 시작되지 않습니다.
- CS9000 - 원시 문자열 리터럴 구분 기호는 자체 줄에 있어야 합니다.
- CS9001 - 여러 줄 원시 문자열 리터럴은 축자 보간된 문자열에서만 허용됩니다.
- CS9002 - 여러 줄 원시 문자열 리터럴에는 하나 이상의 콘텐츠 줄이 포함되어야 합니다.
- CS9003 - 줄에 예상과 다른 공백이 포함됩니다.
- CS9004 - 원시 문자열 리터럴에 대한 따옴표가 충분하지 않습니다.
- CS9005 - 삽입식 원시 문자열 리터럴에 대한 닫는 중괄호가 불충분합니다.
- CS9006 - 보간된 원시 문자열 리터럴에 대해 여는 중괄호가 너무 많습니다.
- CS9007 - 보간된 원시 문자열 리터럴에 닫는 중괄호가 너무 많습니다.
- CS9008 - '@' 문자의 시퀀스는 허용되지 않습니다.
- CS9009 - 문자열은 따옴표 문자로 시작해야 합니다.
이러한 오류를 수정하려면 다음 기술을 적용합니다.
- 전처리기 지시문
#if,#define, 또는#pragma에서는 원시 문자열 리터럴 대신 일반 문자열 리터럴이나 축자 문자열 리터럴을 사용하세요 (CS8996). 사전 처리기 지시문은 어휘 분석이 발생하기 전에 전처리 단계 중에 평가되므로 이후 어휘 분석 단계에서 원시 문자열이 식별되기 때문에 컴파일러는 이러한 컨텍스트에서 원시 문자열 리터럴 구문을 인식할 수 없습니다. - 여는 구분 기호와 일치하는 닫는 구분 기호를 추가하여 원시 문자열 리터럴(CS8997, CS9004)을 완료합니다. 원시 문자열 리터럴 구문을 사용하려면 여는 구분 기호와 닫는 구분 기호가 동일한 수의 연속 큰따옴표 문자(3개 이상)를 포함해야 하므로 누락되거나 일치하지 않는 닫는 구분 기호를 사용하면 컴파일러가 문자열 콘텐츠가 끝나는 위치를 확인할 수 없습니다.
- 여러 줄 원시 문자열 리터럴의 여는 구분 기호와 닫는 구분 기호를 해당 줄에 다른 내용 없이 배치합니다(CS9000). 여러 줄 원시 문자열 형식 규칙은 문자열 콘텐츠에 대한 명확한 경계를 설정하고 모든 콘텐츠 줄에서 일반적인 선행 들여쓰기를 제거하는 공백 트리밍 동작을 사용하도록 설정하기 위해 전용 줄을 차지하는 구분 기호가 필요합니다.
- 여러 줄 원시 문자열 리터럴(CS9002)의 여는 구분 기호와 닫는 구분 기호 사이에 하나 이상의 콘텐츠 줄을 추가합니다. 빈 여러 줄 원시 문자열은 목적이 없고 불완전한 코드를 나타낼 가능성이 높지만 한 줄 원시 문자열(동일한 줄에 구분 기호 포함)은 비어 있을 수 있으며 빈 문자열 값에 적합한 구문이므로 언어 사양에 따라 실제 콘텐츠를 포함해야 합니다.
- 닫는 구분 기호 줄의 들여쓰기(CS8999, CS9003)와 일치하거나 초과하도록 원시 문자열 콘텐츠 줄의 들여쓰기를 조정합니다. 원시 문자열 리터럴에 대한 공백 처리 규칙은 닫는 구분 기호의 선행 공백을 모든 콘텐츠 줄에서 공통 들여쓰기를 트리밍하기 위한 기준으로 사용하므로 닫는 구분 기호보다 들여쓰기가 적은 콘텐츠 줄은 이 트리밍 알고리즘을 위반하고 잘못된 서식을 나타냅니다.
- 원시 문자열 구분 기호의 큰따옴표 문자 수를 늘려 콘텐츠 내 연속된 큰따옴표 문자 시퀀스를 초과하도록 합니다(CS8998). 컴파일러가 콘텐츠의 일부인 따옴표 문자와 문자열의 끝을 표시하는 구분 기호 시퀀스를 명확하게 구분할 수 있도록 구분 기호는 문자열 콘텐츠 내의 모든 시퀀스보다 연속된 따옴표를 더 많이 포함해야 합니다.
- 보간된 원시 문자열 리터럴의 경우, 시작 시 달러 기호 수(
$)가 리터럴 콘텐츠로 필요한 연속된 여는 중괄호나 닫는 중괄호 수(CS9005, CS9006, CS9007)와 일치하는지 반드시 확인합니다. 보간된 원시 문자열 구문은 달러 기호 수를 사용하여 중괄호 이스케이프 시퀀스의 길이를 결정하므로, 보간 구멍에는$$"""가 필요하며, 단일{문자를 콘텐츠로 허용합니다. 반면, 일치하지 않는 중괄호 시퀀스는 잘못된 보간 구문이거나 다른 달러 기호 수가 필요한 콘텐츠를 나타냅니다. -
@원시 문자열 리터럴에서 접두사를 제거하고 따옴표 문자 구분 기호(CS9008, CS9009)만 사용합니다. 원시 문자열 리터럴은 축자 문자열 접두사를 사용하지@않는 C# 11에서 도입된 고유 구문이며, 원시 문자열은 이미 여러 줄 콘텐츠를 지원하며 이스케이프 시퀀스가 필요하지 않으므로 언어 사양에서는 원시 문자열 구분 기호와 축자 구문을 결합@할 수 없습니다.
비고
CS9001 은 더 이상 현재 버전의 C#에서 생성되지 않습니다. 이제 여러 줄의 원시 문자열 리터럴도 축자 형식 없이 문자열 보간을 지원합니다.
자세한 내용은 원시 문자열 리터럴을 참조하세요.
UTF-8 문자열 리터럴
- CS9026 - 입력 문자열을 해당하는 UTF-8 바이트 표현으로 변환할 수 없습니다.
- CS9047 - 연산자는 UTF-8 바이트 표현이 아닌 피연산자에 적용할 수 없습니다.
이러한 오류를 수정하려면 다음 기술을 적용합니다.
- 문자열 리터럴(
u8)에서 UTF-8로 인코딩할 수 없는 문자 또는 이스케이프 시퀀스를 제거합니다. UTF-8 인코딩 사양은 전체 유니코드 문자 집합을 지원하지만 유효한 유니코드 스칼라 값이 필요합니다. 따라서 서로게이트 코드 포인트(U+D800~U+DFFF 범위의 값)는 독립 실행형 문자를 나타내는 대신 UTF-16 서로게이트 쌍 인코딩용으로 예약되어 있고 UTF-8로 인코딩하려고 하면 잘못된 바이트 시퀀스가 생성되기 때문에 UTF-8 문자열에 직접 나타날 수 없습니다. - UTF-8 문자열(
u8)을 연결하는 경우 더하기 연산자의 피연산자가 모두 UTF-8 문자열 리터럴(접미사로 표시됨)인지 확인합니다. 컴파일러는 컴파일 시간에 UTF-8 문자열 리터럴을 연결하는 특별한 지원을 제공합니다. 연결된 UTF-8 바이트 시퀀스를 나타내는 값을 생성ReadOnlySpan<byte>하지만 형식 시스템에서 바이트 범위 또는 텍스트 문자열을 생성할지 여부를 결정할 수 없고 기본 표현(UTF-8바이트 대 UTF-16자)은 기본적으로 호환되지 않으므로 UTF-8 문자열을 일반string값 또는 다른 형식과 혼합하는 것은 지원되지 않습니다.
자세한 내용은 UTF-8 문자열 리터럴을 참조하세요.
데이터 섹션의 리터럴 문자열
- CS9274: 다른 문자열 리터럴과 XXHash128 충돌이 있으므로 이 문자열 리터럴을 데이터 섹션으로 내보낼 수 없습니다.
- CS9315: 프로그램에서 사용하는 사용자 문자열의 결합 길이가 허용된 제한을 초과합니다. 문자열 리터럴을 추가하려면 애플리케이션을 다시 시작해야 합니다.
이러한 문제를 해결하려면 다음 기술을 사용해 보세요.
- 해시 충돌이 발생할 때 애플리케이션에 대한 실험적 데이터 섹션 문자열 리터럴 기능을 사용하지 않도록 설정합니다(CS9274). 이 오류는 두 개의 서로 다른 문자열 리터럴이 동일한 XXHash128 값을 생성하여 최적화가 제대로 작동하지 않도록 하므로 이 실험적 동작을 사용하도록 설정하는 기능 플래그를 제거해야 했음을 나타냅니다.
- 데이터 섹션 기능이 사용하도록 설정된 경우 디버깅 세션 중에 문자열 리터럴을 수정한 후 애플리케이션을 다시 시작합니다(CS9315). 핫 다시 로드 인프라는 런타임에 수정할 수 없는 특수 형식으로 포함되어 있으므로 데이터 섹션에 저장된 문자열 리터럴을 업데이트할 수 없으므로 이전 문자열 값으로 계속 실행하면 잘못된 동작이 생성됩니다.
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET