다음 오류는 컴파일 중에 원본 생성기 또는 인터셉터가 로드될 때 생성됩니다.
-
CS9137: '인터셉터' 실험적 기능을 사용할 수 없습니다. 프로젝트에 추가
<Features>InterceptorsPreview</Features>합니다. - CS9138: 메서드 또는 포함하는 형식에 형식 매개 변수가 있으므로 인터셉터로 사용할 수 없습니다.
- CS9139: 가로챌 수 없음: 컴파일에 경로가 있는 파일이 없습니다.
- CS9140: 가로챌 수 없음: 컴파일에 경로가 있는 파일이 없습니다. 다른 경로를 사용하시겠습니까?
- CS9141: 제공된 줄 및 문자 번호는 가로챌 수 있는 메서드 이름이 아니라 토큰을 참조합니다.
-
CS9142: 지정된 파일에는
n제공된 줄 번호m보다 적은 줄이 있습니다. -
CS9143: 지정된 줄은 문자 길이이며
c제공된 문자 번호n보다 작습니다. -
CS9144: 서명이 일치하지 않으므로 인터셉터를
M사용하여 메서드V를 가로챌 수 없습니다. - CS9145: 가로챌 수 없음: 경로가 매핑되지 않았습니다. 매핑된 경로가 필요합니다.
- CS9146: 인터셉터 메서드는 일반 멤버 메서드여야 합니다.
-
CS9147: 제공된 줄 및 문자 번호는 토큰의 시작을 참조하지 않습니다. 줄
n과 문자를c사용하시겠습니까? -
CS9148: 인터셉터에는 매개 변수 일치 매개 변수가
this있어야 합니다. -
CS9149: 메서드에 매개 변수가
this없으므로 인터셉터에 매개 변수가this없어야 합니다. -
CS9150: 인터셉터에 파일 경로가
null있을 수 없습니다. -
CS9151: 가능한 메서드 이름이
M호출되지 않으므로 가로챌 수 없습니다. - CS9152: 컴파일의 여러 파일에 이 경로가 있으므로 이 경로가 있는 파일의 호출을 가로챌 수 없습니다.
- CS9153: 표시된 호출이 여러 번 가로채집니다.
-
CS9155:
M내에서 액세스할 수 없으므로V호출을 가로막을 수 없습니다. -
CS9156: '범위가 지정된' 한정자 또는
M특성의 차이로 인해V으로[UnscopedRef]호출을 가로챌 수 없습니다. -
CS9157: 제공된 줄 및 문자 번호는
InterceptsLocationAttribute양수여야 합니다. - CS9160: nameof 연산자를 가로챌 수 없습니다.
-
CS9161: 인터셉터는
UnmanagedCallersOnlyAttribute로 표시될 수 없습니다. - CS9177: 인터셉터는 제네릭이 아니거나 일치하는 매개변수 수를 가져야 합니다.
- CS9178: 일치하려면 메서드가 제네릭이 아니어야 합니다.
- CS9206: 전역 네임스페이스에서 인터셉터를 선언할 수 없습니다.
- CS9207: 메서드가 일반 멤버 메서드의 호출이 아니므로 가로챌 수 없습니다.
- CS9231: InterceptsLocationAttribute에 대한 데이터 인수가 올바른 형식이 아닙니다.
- CS9232: 인터셉터 형식의 버전 '버전'은 지원되지 않습니다. 지원되는 최신 버전은 '1'입니다.
- CS9233: 파일 'file'의 호출이 컴파일의 다른 위치에서 중복되므로 호출을 가로챌 수 없습니다.
- CS9234: 컴파일에서 일치하는 파일을 찾을 수 없으므로 파일 'file'의 호출을 가로챌 수 없습니다.
- CS9235: InterceptsLocationAttribute에 대한 데이터 인수는 'file' 파일에서 잘못된 위치를 나타냅니다.
다음 경고는 컴파일 중에 원본 생성기 또는 인터셉터가 로드될 때 생성됩니다.
-
CS8784: 생성기 '
YourSourceGeneratorName'을(를) 초기화하지 못했습니다. 출력에 영향을 주지 않으며 결과적으로 컴파일 오류가 발생할 수 있습니다. -
CS8785: 생성기 '
YourSourceGeneratorName'에서 원본을 생성하지 못했습니다. 출력에 영향을 주지 않으며 결과적으로 컴파일 오류가 발생할 수 있습니다. - CS9057: 분석기 어셈블리는 현재 실행 중인 버전보다 최신 버전의 컴파일러를 참조하므로 사용할 수 없습니다.
- CS9067: 여러 번 지정된 분석기 참조입니다.
-
CS9154: 인터셉터를
M사용하여 호출을V가로채지만 서명이 일치하지 않습니다. - CS9158: 반환 형식에서 참조 형식의 Null 허용 여부가 절편 가능 메서드와 일치하지 않습니다.
- CS9159: 매개 변수 형식의 참조 형식의 Null 허용 여부가 절편 가능 메서드와 일치하지 않습니다.
-
CS9270: '
InterceptsLocationAttribute(string, int, int)'은(는) 지원되지 않습니다. 대신 이러한 특성의 'InterceptableLocation' 기반 생성으로 이동합니다. (https://github.com/dotnet/roslyn/issues/72133)
이러한 오류 및 경고는 다음 테마를 따릅니다.
인터셉터는 실험적입니다.
-
CS9137: '인터셉터' 실험적 기능을 사용할 수 없습니다. 프로젝트에 추가
<Features>InterceptorsPreview</Features>합니다.
실험적 기능인 인터셉터를 사용하려면, 기본적으로 사용이 불가능하므로 <Features>InterceptorsPreview</Features> 요소를 <PropertyGroup> 섹션 내의 프로젝트 파일에 추가해야 합니다. 이 명시적 옵트인은 인터셉터 기능이 향후 릴리스에서 호환성이 손상되거나 제거될 수 있으며, 컴파일러는 사용을 허용하기 전에 위험을 이해한다는 확인이 필요하기 때문에 필요합니다. 인터셉터 및 해당 기능에 대한 자세한 내용은 C# 12 기능 설명서의 인터셉터를 참조하세요.
서명 불일치
다음 오류 및 경고는 인터셉터 메서드와 절편 가능 메서드 간의 불일치를 나타냅니다.
-
CS9144: 서명이 일치하지 않으므로 인터셉터를
M사용하여 메서드V를 가로챌 수 없습니다. -
CS9148: 인터셉터에는 매개 변수 일치 매개 변수가
this있어야 합니다. -
CS9149: 메서드에 매개 변수가
this없으므로 인터셉터에 매개 변수가this없어야 합니다. -
CS9155:
M내에서 액세스할 수 없기 때문에V로 호출을 가로챌 수 없습니다. -
CS9156: 스코프 지정 한정자 또는
M특성의 차이로 인해V와 함께[UnscopedRef]호출을 가로챌 수 없습니다. - CS9177]: 인터셉터는 제네릭이 아니거나 일치하는 항의 수를 가져야 합니다.
- CS9178: 일치하려면 메서드가 제네릭이 아니어야 합니다.
또한 다음 경고는 인터셉터 및 절편 가능 메서드의 서명이 일치하지 않음을 나타냅니다.
-
CS9154:
M호출을V인터셉터를 사용하여 가로채려 했지만, 서명이 일치하지 않습니다. - CS9158: 반환 형식의 참조 형식 Null 허용 여부가 인터셉트 가능 메서드와 일치하지 않습니다.
- CS9159: 매개변수 유형의 참조 형식의 Null 허용 여부가 인터셉트 가능한 메서드와 일치하지 않습니다.
-
CS9270: '
InterceptsLocationAttribute(string, int, int)'은(는) 지원되지 않습니다. 대신 이러한 특성의 'InterceptableLocation' 기반 생성으로 이동합니다. (https://github.com/dotnet/roslyn/issues/72133)
이러한 문제를 해결하려면 인터셉터 메서드가 인터셉트 가능한 메서드의 시그니처 및 액세스 요구 사항과 일치하는지 확인합니다.
- 인터셉터 메서드 시그니처가 절편 가능 메서드(CS9144, CS9154)와 정확히 일치하는지 확인합니다. 매개 변수 형식, 한정자, 순서 및 반환 형식은 동일해야 합니다. 두 메서드 선언을 모두 검토하고 해당 서명을 정렬합니다.
-
this절편 가능 메서드가 인스턴스 메서드(CS9148)일 때 인터셉터에 매개 변수를 추가하거나 절편 가능 메서드가 정적(this)일 때 매개 변수를 제거 합니다. 인스턴스 인터셉터에는 선언 형식의 매개 변수가 필요this하지만 정적 인터셉터에는 매개 변수가 없어야 합니다. - 인터셉터블 메서드에 액세스할 수 있는 위치(CS9155)에서 인터셉터를 선언합니다. 인터셉트 가능한 메서드가
internal인 경우, 인터셉터는 동일한 어셈블리에 있어야 합니다.private이 경우 인터셉터의 형식이 동일하거나 중첩된 형식이어야 합니다. - 해당
scoped매개 변수([UnscopedRef])의ref한정자와 특성을 일치시킵니다. 인터셉터의 각ref매개 변수는 메모리 안전을 보장하기 위해 절편 가능 메서드의 해당 매개 변수와 동일한 수명 주석을 가져야 합니다. - 두 메서드 모두 제네릭 아리티(CS9177, CS9178)와 일치하는지 확인합니다. 절편 가능 메서드가 제네릭이 아닌 경우 인터셉터도 제네릭이 아니어야 합니다. 절편 가능 메서드에 형식 매개 변수가 있는 경우 인터셉터의 형식 매개 변수 수가 호환되는 제약 조건과 동일해야 합니다.
- 반환 형식(CS9158) 및 매개변수 형식(CS9159)의 nullable 주석을 일치시키세요. 프로젝트에서 nullable 참조 형식을 사용하도록 설정하고 인터셉터의 null 허용 여부 주석이 형식 안전을 유지하기 위해 가로챌 수 있는 메서드와 정확히 일치하는지 확인합니다.
- 업데이트된
InterceptableLocation기반 생성InterceptsLocationAttribute을 사용하고, 더 이상 지원되지 않는(string, int, int)생성자(CS9270)를 사용하지 마십시오. 최신 형식은 더 나은 도구 지원 및 컴파일 시간 유효성 검사를 제공합니다. 마이그레이션 지침은 GitHub 문제를 참조하세요.
잘못된 매핑
인터셉터에는 인터셉터가 가능한 메서드와 인터셉터 메서드를 매핑하는 원본 매핑이 필요합니다. 다음 오류는 매핑과 관련된 문제를 나타냅니다.
- CS9139: 가로챌 수 없음: 컴파일에 경로가 있는 파일이 없습니다.
- CS9140: 가로챌 수 없음: 컴파일에 경로가 있는 파일이 없습니다. 다른 경로를 사용하시겠습니까?
- CS9141: 제공된 줄 및 문자 번호는 가로챌 수 있는 메서드 이름이 아니라 토큰을 참조합니다.
-
CS9142: 지정된 파일에는
n제공된 줄 번호m보다 적은 줄이 있습니다. -
CS9143: 지정된 줄은 문자 길이이며
c제공된 문자 번호n보다 작습니다. - CS9145: 가로챌 수 없음: 경로가 매핑되지 않았습니다. 매핑된 경로가 필요합니다.
-
CS9147: 제공된 줄 및 문자 번호는 토큰의 시작을 참조하지 않습니다. 줄
n과 문자를c사용하시겠습니까? -
CS9150: 인터셉터에 파일 경로가
null있을 수 없습니다. -
CS9157:
InterceptsLocationAttribute에게 제공된 줄 및 문자 번호는 반드시 양수여야 합니다.
매핑 오류를 수정하려면 유효한 파일 경로와 정확한 위치 정보가 포함되어 있는지 확인합니다 InterceptsLocationAttribute .
- 파일 경로가 컴파일의 파일과 정확히 일치하는지 확인합니다(CS9139, CS9140). 프로젝트에서 나타나는 경로를 정확히 사용하되, 올바른 대/소문자 및 디렉터리 구분 기호를 포함해야 합니다. 컴파일러에서 대체 경로를 제안하는 경우 해당 경로를 사용하도록 특성을 업데이트합니다.
- 파일 경로를 변환하는 원본 생성기(CS9145)로 작업할 때 매핑된 파일 경로를 사용합니다. 원본 생성기는 생성된 파일에 대한 경로를 다시 매핑하는 경우가 많으며, 원래 원본 경로가 아니라 컴파일러가 인식하는 매핑된 경로를 사용해야 합니다.
- 파일 경로가
null로 설정되지 않았는지InterceptsLocationAttribute(CS9150)에서 확인하세요. 모든 가로채기는 가로채기 호출을 포함하는 원본 파일을 식별하는 유효한 null이 아닌 파일 경로를 지정해야 합니다. - 양의 1부터 시작하는 줄과 문자 번호를 제공합니다(CS9157). 줄 번호와 문자 위치는 0이 아닌 1에서 시작해야 합니다. 위치를 계산할 때 원본 생성기가 1부터 시작하는 인덱싱을 사용하는지 확인합니다.
- 메서드 이름 토큰(CS9141, CS9147)의 정확한 시작을 가리킵니다. 줄 및 문자 번호는 호출에서 공백, 연산자 또는 기타 토큰이 아닌 메서드 이름의 첫 번째 문자를 식별해야 합니다. 컴파일러에서 대체 좌표를 제안하는 경우 이를 사용하여 올바른 토큰 시작을 대상으로 지정합니다.
- 파일 범위 내에 유지합니다(CS9142, CS9143). 줄 번호가 총 줄 수를 초과하지 않고 문자 번호가 줄 길이를 초과하지 않는지 확인합니다. 특성이 생성된 이후 원본 파일이 변경된 경우 위치를 다시 계산합니다.
잘못된 인터셉터 선언
다음 오류는 인터셉터 규칙의 형식 또는 위반 문제를 포함하여 인터셉터 선언과 관련된 InterceptsLocationAttribute 문제를 나타냅니다.
- CS9138: 메서드 또는 포함하는 형식에 형식 매개 변수가 있으므로 인터셉터로 사용할 수 없습니다.
- CS9146: 인터셉터 메서드는 일반 멤버 메서드여야 합니다.
-
CS9151: 가능한 메서드 이름
M이(가) 호출되지 않아서 가로챌 수 없습니다. - CS9152: 컴파일의 여러 파일에 이 경로가 있으므로 이 경로가 있는 파일의 호출을 가로챌 수 없습니다.
- CS9153: 표시된 호출이 여러 번 가로채집니다.
- CS9160: nameof 연산자를 가로챌 수 없습니다.
-
CS9161: 인터셉터는
UnmanagedCallersOnlyAttribute로 표시할 수 없습니다. - CS9206: 전역 네임스페이스에서 인터셉터를 선언할 수 없습니다.
- CS9207: 메서드가 일반 멤버 메서드의 호출이 아니므로 가로챌 수 없습니다.
- CS9231: InterceptsLocationAttribute에 대한 데이터 인수가 올바른 형식이 아닙니다.
- CS9232: 인터셉터 형식의 버전 '버전'은 지원되지 않습니다. 지원되는 최신 버전은 '1'입니다.
- CS9233: 파일 'file'의 호출이 컴파일의 다른 위치에서 중복되므로 호출을 가로챌 수 없습니다.
- CS9234: 컴파일에서 일치하는 파일을 찾을 수 없으므로 파일 'file'의 호출을 가로챌 수 없습니다.
- CS9235: InterceptsLocationAttribute에 대한 데이터 인수는 'file' 파일에서 잘못된 위치를 나타냅니다.
인터셉터 선언 오류를 수정하려면 유효한 인터셉터 선언 및 InterceptsLocationAttribute 사용에 대해 다음 규칙을 따릅니다.
- 데이터 인수의 서식을
InterceptsLocationAttribute올바르게 지정합니다(CS9231). 이 특성에는 파일 경로 및 위치 정보를 인코딩하는 특별히 구조화된 데이터가 필요합니다. 원본 생성기가 현재 인터셉터 사양과 일치하는 예상 형식으로 데이터를 생성하는지 확인합니다. - 지원되는 최신 버전이므로 (
InterceptsLocationAttribute)에서 버전 '1'을 사용합니다. 지원되지 않는 버전 번호가 아닌 버전 1 형식 특성을 출력하도록 원본 생성기를 업데이트합니다. - 컴파일에서 고유한 파일 경로를 확인합니다(CS9233, CS9234). 컴파일에 중복된 파일 경로가 포함된 경우 파일 이름을 바꾸거나 다시 구성하여 각 경로를 고유하게 만듭니다. 특성의 파일 경로가 컴파일에 실제로 포함된 파일과 일치하는지 확인합니다.
- 유효한 코드 위치(CS9235)에 대한 위치 데이터 요소의 유효성을 검사합니다. 줄 및 문자 번호는 지정된 파일 내에서 유효한 인터셉트 지점을 참조해야 합니다. 원본 파일이 변경되었거나 위치가 파일의 범위를 벗어나는 경우 특성을 다시 생성합니다.
- 제네릭이 아닌 형식(CS9138)에서 제네릭이 아닌 인터셉터 메서드를 선언합니다. 인터셉터는 메서드 자체 또는 포함하는 형식에 형식 매개 변수를 가질 수 없습니다. 제네릭 메서드를 가로채야 하는 경우 생성된 특정 형식에서 작동하는 제네릭이 아닌 인터셉터를 만듭니다.
- 인터셉터를 일반 멤버 메서드로 만듭니다(CS9146). 인터셉터는 연산자, 생성자, 종료자, 속성 또는 인덱서일 수 없습니다. 인터셉터를 일반 정적 또는 인스턴스 메서드로 선언합니다.
- 식이 아닌 실제 메서드 호출을 가로챌 수 있습니다(CS9151, CS9207). 호출되는 일반 멤버 메서드에 대한 호출만 가로챌 수 있습니다. 호출하지 않고는 참조되는 메서드 그룹, 대리자 또는 메서드를 가로챌 수 없습니다. 가로챌 수 있는 위치가 실제 메서드 호출을 식별하는지 확인합니다.
- 중복 가로채기 시도 제거(CS9153). 각 메서드 호출은 한 번만 가로챌 수 있습니다. 여러
InterceptsLocationAttribute인스턴스가 동일한 호출을 대상으로 하는 경우 모호성을 해결하기 위해 하나를 제외한 모든 인스턴스를 제거합니다. - 연산자
nameof를 차단하지 마세요(CS9160). 연산자는nameof런타임에 메서드를 호출하지 않으므로 가로챌 수 없습니다. 런타임에 실행되는 실제 메서드 호출만 가로채야 합니다. - 인터셉터에서
UnmanagedCallersOnlyAttribute을(를) 제거하십시오 (CS9161). 인터셉터는 관리 코드에서 호출할 수 있어야 하며 로 표시UnmanagedCallersOnlyAttribute할 수 없습니다. 인터셉터 메서드 선언에서 특성을 제거합니다. - 네임스페이스 내에서 인터셉터를 선언합니다(CS9206). 인터셉터는 전역 네임스페이스에서 선언할 수 없으며 하나 이상의 네임스페이스 선언 내에 포함되어야 합니다. 인터셉터 클래스를 네임스페이스로 래핑합니다.
- 컴파일 수준(CS9152)에서 중복 파일 경로를 확인합니다. 여러 파일이 컴파일에서 동일한 경로를 공유하는 경우 컴파일러는 가로챌 파일을 확인할 수 없습니다. 빌드 구성이 고유한 파일 경로를 생성하거나 원본 파일에 대해 다른 조직 전략을 사용하는지 확인합니다.
분석기 호환성
다음 경고는 분석기 또는 원본 생성기 어셈블리와 관련된 문제를 나타냅니다.
- CS9057: 분석기 어셈블리는 현재 실행 중인 버전보다 최신 버전의 컴파일러를 참조하므로 사용할 수 없습니다.
- CS9067: 여러 번 지정된 분석기 참조입니다.
이러한 경고는 분석기 어셈블리와 호환성 문제가 있을 때 발생합니다.
- CS9057 은 분석기 어셈블리가 현재 실행 중인 컴파일러보다 최신 버전의 Roslyn 컴파일러를 참조할 때 생성됩니다. 분석기가 로드되지 않는 이유는 현재 컴파일러 버전이 지원하지 않는 API 또는 동작에 의존할 수 있기 때문입니다. 이 문제를 해결하려면 분석기의 요구 사항에 맞게 컴파일러/SDK를 업그레이드하거나 현재 컴파일러 버전과 호환되는 분석기 버전을 사용합니다.
- CS9067 은 프로젝트에서 동일한 분석기 어셈블리를 여러 번 참조할 때 경고합니다. 이는 일반적으로 분석기가 여러 경로 또는 패키지 참조를 통해 포함될 때 발생합니다. 오류는 아니지만 중복 참조는 빌드 성능에 영향을 줄 수 있으며 예기치 않은 동작이 발생할 수 있습니다. 이 경고를 해결하려면 중복 참조를 제거합니다.
.NET