이 문서에서는 다음 컴파일러 오류를 다룹니다.
-
CS1983: 비동기 메서드이므로 반환 식은 '
T'이 아닌 'Task<T>' 형식이어야 합니다. - CS1985: catch 절에서 대기할 수 없습니다.
-
CS1986: '
await'을 사용하려면 형식에 적합한 'GetAwaiter' 메서드가 있어야 합니다. - CS1989: 비동기 람다 식을 식 트리로 변환할 수 없습니다.
- CS1991: 'Type'은 Windows 런타임 이벤트이고 'event'는 일반 .NET 이벤트이므로 'event'를 구현할 수 없습니다.
-
CS1992: '' 연산자는 '
awaitasync' 한정자로 표시된 메서드 또는 람다 식 내에 포함된 경우에만 사용할 수 있습니다. -
CS1994: '
async' 한정자는 본문이 있는 메서드에서만 사용할 수 있습니다. -
CS1995: '
await' 연산자는 초기 '' 절의 첫 번째 컬렉션 식 내의 쿼리 식 또는 'fromjoin' 절의 컬렉션 식 내에서만 사용할 수 있습니다. - CS1996: lock 문의 본문에서 대기할 수 없습니다.
- CS1997: 함수는 값을 반환하는 비동기 메서드이므로 반환 키워드 뒤에 개체 식이 있으면 안 됩니다.
-
CS1998: 이 비동기 메서드는 '
await' 연산자가 부족하고 동기적으로 실행됩니다. 'await' 연산자를 사용하여 비차단 API 호출을 기다리거나 'await Task.Run(...)'를 사용하여 백그라운드 스레드에서 CPU 바인딩된 작업을 수행하는 것이 좋습니다. - CS4001: 식을 기다릴 수 없습니다.
-
CS4003: '
await'은 비동기 메서드 또는 람다 식 내에서 식별자로 사용할 수 없습니다. - CS4005: 비동기 메서드에는 포인터 형식 매개 변수가 있을 수 없습니다.
- CS4006: 비동기 메서드의 매개 변수 목록에서는 __arglist 허용되지 않습니다.
-
CS4007: 형식 인스턴스는 '' 또는 '
awaityield' 경계를 넘어 유지할 수 없습니다. -
CS4008: ''
void을 기다릴 수 없습니다. - CS4009: void 또는 int 반환 진입점은 비동기일 수 없습니다.
- CS4010: 비동기 식을 대리자 형식으로 변환할 수 없습니다. 비동기 식은 void, Task 또는 Task<T>를 반환할 수 있으며, 이 중 어느 것도 형식으로 변환할 수 없습니다.
-
CS4011: ''에는 '
await{1}의 반환 형식이 필요합니다. GetAwaiter()'에는 적절한 'IsCompleted', 'OnCompleted' 및 'GetResult' 멤버가 있으며 'INotifyCompletion' 또는 'ICriticalNotifyCompletion'을 구현합니다. - CS4012: 형식의 매개 변수는 비동기 메서드 또는 비동기 람다 식에서 선언할 수 없습니다.
-
CS4014: 이 호출이 대기되지 않으므로 호출이 완료되기 전에 현재 메서드의 실행이 계속됩니다. 호출 결과에 연산자를 적용하는
await것이 좋습니다. - CS4015: 'MethodImplOptions.Synchronized'는 비동기 메서드에 적용할 수 없습니다.
- CS4016: 비동기 메서드이므로 반환 식은 선언된 형식이 아닌 Task와 같은 형식이어야 합니다.
- CS4027: 식 형식이 필요한 멤버를 구현하지 않습니다.
-
CS4028: '
await'을 사용하려면 형식에 적합한 'GetAwaiter' 메서드가 있어야 합니다. 'System'에 대한 using 지시문이 누락되었나요? - CS4029: 'void' 형식의 식을 반환할 수 없습니다.
- CS4030: 비동기 메서드에는 보안 특성을 적용할 수 없습니다.
- CS4031: 'SecurityCritical' 또는 'SecuritySafeCritical' 특성이 있는 인터페이스, 클래스 또는 구조체에서는 비동기 메서드가 허용되지 않습니다.
-
CS4032: '
await' 연산자는 비동기 메서드 내에서만 사용할 수 있습니다. 이 메서드를 'async' 한정자로 표시하고 반환 형식을 ''Task<T>로 변경하는 것이 좋습니다. -
CS4033: '
await' 연산자는 비동기 메서드 내에서만 사용할 수 있습니다. 이 메서드를 'async' 한정자를 사용하여 표시하고 반환 형식을 ''Task로 변경하는 것이 좋습니다. -
CS4034: '
await' 연산자는 비동기 메서드 내에서만 사용할 수 있습니다. 이 메서드를 'async' 한정자로 표시하는 것이 좋습니다. - CS8031: 대리자를 반환하는 작업으로 변환된 비동기 람다 식은 값을 반환할 수 없습니다.
-
CS8100: '
await' 연산자는 정적 스크립트 변수 이니셜라이저에서 사용할 수 없습니다. - CS8177: 비동기 메서드에는 참조별 로컬이 있을 수 없습니다.
-
CS8178: 메서드 호출에서 반환된 참조는 '' 또는 '
awaityield' 경계를 넘어 유지할 수 없습니다. - CS8204: 형식 대상에 대해 AsyncMethodBuilder로 사용되는 형식의 경우 해당 Task 속성은 선언된 형식 대신 대상 형식을 반환해야 합니다.
-
CS8403: 반복기 블록이 있는 메서드는 IAsyncEnumerable
asyncT<를 반환하려면 '>'이어야 합니다. - CS8411: 형식에 필요한 멤버에 적합한 공용 인스턴스 또는 확장 정의가 포함되어 있지 않으므로 비동기 foreach 문은 형식 변수에서 작동할 수 없습니다.
- CS8892: 동기 진입점을 찾았으므로 메서드가 진입점으로 사용되지 않습니다.
- CS8935: 명시적 반환 형식이 없는 익명 메서드에서는 AsyncMethodBuilder 특성이 허용되지 않습니다.
- CS8940: 제네릭 작업 유형의 반환 형식이 예상되었지만 'AsyncMethodBuilder' 특성에 있는 형식은 적합하지 않았습니다. 이 형식은 하나의 인수를 갖는 언바운드 제네릭 형식이어야 하며 포함하는 형식(있는 경우)은 제네릭이 아니어야 합니다.
-
CS9123: '
&' 연산자는 비동기 메서드의 매개 변수 또는 지역 변수에 사용하면 안 됩니다. -
CS9330: '
MethodImplAttribute.Async'은(는) 메서드에 수동으로 적용할 수 없습니다. 메서드 'async'를 표시합니다.
미뤄두기 식 요구 사항
- CS1985: catch 절에서 대기할 수 없습니다.
-
CS1986: '
await'을 사용하려면 형식에 적합한 'GetAwaiter' 메서드가 있어야 합니다. -
CS1992: '' 연산자는 '
await' 한정자가 표시된async메서드 또는 람다 식에 포함된 경우에만 사용할 수 있습니다. -
CS1995: '
await' 연산자는 초기 '' 절의 첫 번째 컬렉션 식 내의 쿼리 식 또는 'fromjoin' 절의 컬렉션 식 내에서만 사용할 수 있습니다. - CS1996: lock 문의 본문에서 대기할 수 없습니다.
-
CS4008: ''
void을 기다릴 수 없습니다. -
CS4032: '
await' 연산자는 비동기 메서드 내에서만 사용할 수 있습니다. 이 메서드를 'async' 한정자를 사용하여 표시하고 반환 형식을 ''Task<T>로 변경하는 것이 좋습니다. -
CS4033: '
await' 연산자는 비동기 메서드 내에서만 사용할 수 있습니다. 이 메서드를 'async' 한정자를 사용하여 표시하고 반환 형식을 ''Task로 변경하는 것이 좋습니다. -
CS4034: '
await' 연산자는 비동기 메서드 내에서만 사용할 수 있습니다. 이 메서드를 'async' 한정자로 표시하는 것이 좋습니다. -
CS8178: 이 호출에서 반환된 참조는 '' 또는 '
awaityield' 경계를 넘어 유지할 수 없습니다. - CS8411: 형식에 필요한 멤버에 적합한 공용 인스턴스 또는 확장 정의가 포함되어 있지 않으므로 비동기 foreach 문은 형식 변수에서 작동할 수 없습니다.
- CS4001: 식을 기다릴 수 없습니다.
-
CS4003: '
await'은 비동기 메서드 또는 람다 식 내에서 식별자로 사용할 수 없습니다. -
CS4007: 형식 인스턴스는 '' 또는 '
awaityield' 경계를 넘어 유지할 수 없습니다. -
CS4011: '
await'을 사용하려면 'GetAwaiter()'의 반환 형식이 적합한 'IsCompleted', 'OnCompleted' 및 'GetResult' 멤버를 가져야 하며 'INotifyCompletion' 또는 'ICriticalNotifyCompletion'을 구현해야 합니다. - CS4027: 형식이 필요한 멤버를 구현하지 않습니다.
-
CS4028: '
await'을 사용하려면 형식에 적합한 'GetAwaiter' 메서드가 있어야 합니다. 'System'에 대한 using 지시문이 누락되었나요? -
CS8100: '
await' 연산자는 정적 스크립트 변수 이니셜라이저에서 사용할 수 없습니다.
다음 항목에서는 각 오류를 수정하는 방법을 설명합니다. 연산자 및 awaiter 패턴에 대한 await 자세한 내용은 비동기 및 await를 사용한 비동기 프로그래밍을 참조하세요.
-
async식(await, CS4033, CS4034)을 포함하는 메서드 또는 람다 식에 한정자를 추가합니다. 컴파일러는 비동기 일시 중단 및 재개를 처리하는 상태 컴퓨터를 생성할 수 있도록 한정자가 필요합니다async. 이 오류의 세 가지 변형은 올바른 반환 형식에 대한 컨텍스트별 제안을 제공합니다. - C# 5 이하(
await)를 대상으로 할 때 식을 블록 밖으로catch이동합니다. C# 6부터 컴파일러는await및catch블록, 그리고finally블록에서 모두 지원합니다. 이 오류는 더 이상 C# 6 이상에서 생성되지 않습니다. -
await식을lock명령문 블록 밖으로 이동하십시오 (CS1996). 잠금을 보유한 상태에서 비동기 일시 중단은 교착 상태 위험을 초래할 수 있습니다. 잠금은 다른 코드가 동일한 잠금을 기다리고 있을 수 있는 스레드 스위치에서 유지됩니다. - 초기 쿼리 식의 첫 번째 컬렉션 식 또는
await의 컬렉션 식에서만 나타나도록from을 재구성합니다(join). 다른 쿼리 절은 비동기 일시 중단을 지원하지 않는 람다 식으로 변환됩니다. -
GetAwaiter()(CS1986, CS4028)을 따르는 액세스 가능한 메서드를 노출할 수 있도록 대기된 식의 형식을 변경합니다. 형식은 직접 또는 확장 메서드를 통해 패턴을 구현할 수 있습니다. 메서드가GetAwaiter있지만 지시using문이System없는 경우 컴파일러는 CS1986 대신 보다 구체적인 CS4028 메시지를 생성합니다. - 반환된
GetAwaiter()awaiter 형식에IsCompleted,OnCompleted,GetResult멤버가 있고, INotifyCompletion 또는 ICriticalNotifyCompletion를 구현하는지 확인하십시오 (CS4011, CS4027). 식은await표현 완성 상태를 확인하고, 이어지는 동작을 등록하며, 결과를 검색하기 위해 이 멤버에 의존합니다. - 호출된 메서드의 반환 형식을
void에서 결과를 대기할 수 있도록 Task 또는 Task<TResult>로 수정합니다(CS4008). 완료를 추적하거나 예외를void전파할 작업 개체가 없으므로 -returning 메서드를 기다릴 수 없습니다. - 대기된 식을 awaiter 패턴 (CS4001)을 지원하는 형식으로 변경합니다. 기본 제공 형식인
int,string및 기타 형식에는GetAwaiter메서드가 없으며, 따라서 직접 기다릴 수 없습니다. - 사용하기 전에
await메서드 호출 결과를 지역 변수에 저장합니다(CS8178). 비동기 상태 컴퓨터가 다른 스레드 또는 컨텍스트에서 일시 중단 및 다시 시작되어 참조가 무효화될 수 있으므로 메서드에서 반환된 참조는 경계를 넘어await보존할 수 없습니다. - 컬렉션 형식에서 IAsyncEnumerable<T>를 구현하거나,
GetAsyncEnumerator및Current멤버가 포함된 형식을 반환하는 액세스 가능한MoveNextAsync메서드를 추가합니다(CS8411). 이await foreach문을 사용하려면 컬렉션 형식이 비동기 열거 가능 패턴을 따라야 합니다. - 메서드 또는 람다 식(
await) 내에서 명명된async모든 지역 변수 또는 매개 변수의 이름을 바 꿉니다. 비동기 컨텍스트await내에서 컨텍스트 키워드이며 식별자로 사용할 수 없습니다. -
await정적 스크립트 변수 이니셜라이저에서 메서드 본문(CS8100)으로 식을 이동합니다. 정적 이니셜라이저는 비동기 컨텍스트 외부에서 실행되므로await해당 위치에서는 사용할 수 없습니다. - 코드를 재구성하여
ref struct인스턴스가await또는yield경계를 넘어갈 때 보존할 필요가 없도록 합니다 (CS4007). 비동기 상태 컴퓨터는 힙에 지역 변수를 저장하고ref struct형식은 의도적으로 스택 바인딩됩니다. 일시 중단 지점에서 힙 스토리지로 안전하게 이동할 수 없습니다.
비동기 메서드 서명 요구 사항
-
CS1983: 비 동기 메서드이므로 반환 식은 ''이 아닌
Task<T>'T' 형식이어야 합니다. -
CS1994: '
async' 한정자는 본문이 있는 메서드에서만 사용할 수 있습니다. - CS4009: void 또는 int 반환 진입점은 비동기일 수 없습니다.
- CS8892: 동기 진입점을 찾았으므로 메서드가 진입점으로 사용되지 않습니다.
- CS8935: 명시적 반환 형식이 없는 익명 메서드에서는 AsyncMethodBuilder 특성이 허용되지 않습니다.
- CS8940: 제네릭 작업 유형과 유사한 반환 형식을 기대했습니다. 그러나 'AsyncMethodBuilder' 특성에 있는 형식은 적합하지 않습니다. 이 형식은 인자가 하나인 비결합 제네릭 형식이어야 하고, 포함하는 형식(있는 경우)은 제네릭이 아니어야 합니다.
-
CS8403: 반복기 블록이 있는 메서드는 ''을 반환하려면 '
async{1}'이어야 합니다. -
CS9330: '
MethodImplAttribute.Async'은(는) 메서드에 수동으로 적용할 수 없습니다. 메서드 ''async를 표시합니다. - CS4005: 비동기 메서드에는 포인터 형식 매개 변수가 있을 수 없습니다.
- CS4006: 비동기 메서드의 매개 변수 목록에서는 __arglist 허용되지 않습니다.
- CS4010: 비동기 람다를 대리자 형식으로 변환할 수 없습니다. 비동기 람다는 void, Task 또는 Task<T>를 반환할 수 있으며, 이 중 어느 것도 반환 형식으로 변환할 수 없습니다.
- CS4012: 형식의 매개 변수는 비동기 메서드 또는 비동기 람다 식에서 선언할 수 없습니다.
- CS4015: 'MethodImplOptions.Synchronized'는 비동기 메서드에 적용할 수 없습니다.
- CS4016: 비 동기 메서드이므로 반환 식은 형식이 아닌 작업 형식이어야 합니다.
- CS8031: 대리자를 반환하는 작업으로 변환된 비동기 람다 식은 값을 반환할 수 없습니다.
- CS8204: 형식에 대해 AsyncMethodBuilder로 사용되는 형식의 경우 해당 Task 속성은 선언된 형식 대신 필수 형식을 반환해야 합니다.
다음 항목에서는 각 오류를 수정하는 방법을 설명합니다. 비동기 메서드 선언에 대한 자세한 내용은 한정자 및 async 참조 하세요.
- 비동기 메서드의 기본 결과 형식(CS1983, CS4016)과 일치하도록 반환 식을 변경합니다. 비동기 메서드가
Task<T>을 반환하면, 컴파일러에서 생성된return가 그 값을 태스크 안에 자동으로 래핑하기 때문에T가 아닌,Task<T>형식의 값을 제공해야 합니다. 메서드가 를 반환하고 식이Task<T>인 경우T이 나타납니다. CS4016은 반환 식 유형이 일치하지 않는 일반적인 경우를 다룹니다. -
async추상 메서드 또는 인터페이스 메서드 선언(CS1994)과 같이 본문이 없는 메서드에서 한정자를 제거합니다. 컴파일러가async상태 컴퓨터 구현을 생성할 수 있도록 한정자에는 메서드 본문이 필요합니다. - 비동기 진입점의 반환 형식을 TaskTask<TResult>로 변경합니다 . C# 7.1부터
Main메서드는async할 수 있지만,Task또는Task<int>-async void을 반환해야 하며,async int은 유효한 진입점 서명이 아닙니다. - 프로젝트에 동기 메서드와 비동
Main기 메서드(CS8892)가 모두 포함된 경우 진입점 하나를 제거하거나 이름을 바꿉니다. 컴파일러는 동기 진입점을 선택하고 무시되는 비동기 후보에게 이 경고를 실행합니다. - 특성을 적용하기 전에 람다 식에 명시적 반환 형식을
[AsyncMethodBuilder]추가합니다(CS8935). 컴파일러는 컴파일 시간에 특성이 특정 반환 형식과 일치해야 하므로 반환 형식이 유추되는 익명 메서드의 작성기 형식을 확인할 수 없습니다. - 특성에 지정된
[AsyncMethodBuilder]형식을 형식 매개변수가 하나인 언바운드 제네릭 형식으로 변경합니다. 예를 들어MyTaskMethodBuilder<>대신MyTaskMethodBuilder<T>또는 비제네릭 형식(CS8940)을 사용합니다. 작성기 포함 형식(있는 경우)도 제네릭이 아니어야 합니다. 컴파일러는 구체적인 작업과 유사한 반환 형식에 대한 작성기를 생성할 수 있도록 이 셰이프가 필요합니다. - 수동
[MethodImpl(MethodImplOptions.Async)]특성을 메서드 선언의async키워드로 바꿉니다(CS9330). 플래그는MethodImplOptions.Async내부 런타임 사용을 위해 예약되어 있으며 사용자 코드에서 직접 적용할 수 없습니다. -
async한정자를 반복기 블록을 포함하고 IAsyncEnumerable<T> 또는 IAsyncEnumerator<T>을 반환하는 메서드에 추가하세요 (CS8403).async한정자가 없으면 컴파일러는 메서드를 동기 반복기로 처리하고 비동기 스트림 상태 컴퓨터를 생성할 수 없습니다. - 비동기 메서드(CS4005)에서 포인터 형식 매개 변수를 제거합니다. 포인터는 다른 스레드에서 실행을 다시 시작할 수 있는 비동기 일시 중단 지점에서 안전하게 보존할 수 없는 고정 메모리 위치를 참조합니다.
- 비동기 메서드 매개 변수 목록에서 제거
__arglist합니다(CS4006). 가변 길이 인수 목록은 힙 할당 비동기 상태 컴퓨터와 호환되지 않는 스택 기반 호출 규칙에 따라 달라집니다. - 비동기 메서드 또는 비동기 람다 식(CS4012)에서
ref,in,out매개 변수와ref struct형식의 매개 변수, 예를 들어 Span<T>나 ReadOnlySpan<T> 매개 변수를 제거하세요. 이러한 매개 변수 형식은 스택 바인딩되며 힙 할당 비동기 상태 컴퓨터 닫기에서 안전하게 캡처할 수 없습니다. - 비동기 람다의 반환 형식(CS4010)과 일치하도록 대상 대리자 형식을 변경합니다. 비동기 람다는
void, Task, 또는 Task<TResult>를 반환할 수 있으며, 컴파일러는 이를 서로 다른 반환 형식을 요구하는 임의의 대리자 형식으로 변환할 수 없습니다. -
return식을 제네릭이 아닌Task반환 대리자에 할당된 비동기 람다에서 제거하거나, 람다가 값을 반환할 수 있도록 대리자 형식을Func<Task<T>>로 변경합니다(CS8031). 제네릭Task이 아닌 반환 대리자는 결과가 없는 비동기 작업을 나타내므로 값을 반환하는 것은 형식 불일치입니다. - 비동기
[MethodImpl(MethodImplOptions.Synchronized)]메서드(CS4015)에서 특성을 제거합니다. 이Synchronized옵션은 전체 메서드 실행에 대한 잠금을 획득하지만 비동기 메서드는 잠재적으로 다른 스레드에서 일시 중단 및 다시 시작되므로 잠금 의미 체계가 정의되지 않습니다. - 해당
AsyncMethodBuilder속성이 비동기 메서드의 선언된 반환 형식(Task)과 동일한 형식을 반환할 수 있도록 사용자 지정 형식을 수정합니다. 컴파일러는 작성Task기 속성을 사용하여 최종 작업 개체를 가져오므로 형식 불일치로 인해 상태 컴퓨터가 제대로 작동하지 않습니다.
비동기 사례
- CS1989: 비동기 람다 식을 식 트리로 변환할 수 없습니다.
- CS1991: 'Type'은 Windows 런타임 이벤트이고 'event'는 일반 .NET 이벤트이므로 'event'를 구현할 수 없습니다.
- CS1997: 함수는 값을 반환하는 비동기 메서드이므로 반환 키워드 뒤에 개체 식이 있으면 안 됩니다.
-
CS1998: 이 비동기 메서드는 '
await' 연산자가 부족하고 동기적으로 실행됩니다. 'await' 연산자를 사용하여 비차단 API 호출을 기다리거나 'await Task.Run(...)'를 사용하여 백그라운드 스레드에서 CPU 바인딩된 작업을 수행하는 것이 좋습니다. -
CS4014: 이 호출이 대기되지 않으므로 호출이 완료되기 전에 현재 메서드의 실행이 계속됩니다. 호출 결과에 연산자를 적용하는
await것이 좋습니다. - CS8177: 비동기 메서드에는 참조별 로컬이 있을 수 없습니다.
-
CS9123: '
&' 연산자는 비동기 메서드의 매개 변수 또는 지역 변수에 사용하면 안 됩니다. - CS4029: 'void' 형식의 식을 반환할 수 없습니다.
- CS4030: 비동기 메서드에는 보안 특성을 적용할 수 없습니다.
- CS4031: 'SecurityCritical' 또는 'SecuritySafeCritical' 특성이 있는 인터페이스, 클래스 또는 구조체에서는 비동기 메서드가 허용되지 않습니다.
다음 항목에서는 각 오류를 수정하는 방법을 설명합니다. 자세한 내용은 async 및 await를 사용한 비동기 프로그래밍과 await 연산자을 참조하십시오.
-
await연산자를 Task 또는 Task<TResult>를 반환하는 모든 호출에 추가하거나,_ =를 사용하여 결과를 명시적으로 버리십시오. 이는 fire-and-forget 동작이 실제로 의도된 경우에만 해당됩니다(CS4014). 없으면await비동기 작업에서 throw된 예외가 자동으로 손실되고 호출 메서드는 작업이 완료되기 전에 계속 실행되므로 미묘한 순서 지정 및 수정 버그가 발생할 수 있습니다. -
return반환 형식이 제네릭이Task아닌 비동기 메서드에서 식을 제거하거나 반환 형식을Task<T>메서드가 값을 반환해야 할 때로 변경합니다(CS1997). 반환Task되는 비동기 메서드에서 컴파일러는 작업 래퍼를 생성합니다. 메서드 시그니처가 결과를 약속하지 않으므로 값을 반환하는 것은 형식 불일치입니다. - 메서드 본문에 식을 하나
await이상 추가하거나 한정자를 제거하고async작업을 직접 반환합니다(CS1998).async식이 없는await메서드는 완전히 동기적으로 실행되어 불필요한 상태 컴퓨터 오버헤드를 추가합니다. 메서드가 의도적으로 동기 작업을 래핑하는 경우,async을(를) 제거하고 작업을 명시적으로 반환하면 해당 오버헤드가 제거됩니다. - 람다 식을
async유형(와 같은)에 할당할 때Expression<Func<...>>를 사용하지 않도록 다시 작성합니다. 식 트리는 컴파일러가 분석하거나 변환할 수 있는 데이터 구조로 코드를 나타내지만, 생성하는 복잡한 상태 머신async은 식 트리에서 캡처할 수 없습니다. - 인터페이스 선언과 구현 클래스가 모두 이벤트가 Windows 런타임 의미 체계 또는 일반 .NET 의미 체계(CS1991)를 사용하는지 여부에 동의할 수 있도록 이벤트 구현을 변경합니다. 이 오류는 WinRT 이벤트를 일반 .NET 이벤트로 구현할 수 없거나 그 반대로 구현할 수 없는 Windows 런타임 interop 시나리오에 적용됩니다.
- 비동기 메서드(
&) 내의 매개 변수 또는 지역 변수를 참조하는 식에서 연산자 주소()를 제거합니다. 비동기 상태 기계는 일시 중단 시 캡처된 변수를 힙으로 재배치할 수 있으며, 이는 주소 연산자로 가져온 모든 포인터를 무효화할 수 있습니다. - 비동기 메서드에서 참조에 의한 지역 변수를 제거하거나 해당 변수가
await경계를 넘어가지 않는지 확인합니다(CS8177). 비동기 상태 컴퓨터는 힙 할당 닫기에서 지역 변수를 캡처하며 스택 위치에 대한 참조는 일시 중단 지점에서 안전하게 보존할 수 없습니다. C# 13 이상에서는ref로컬 변수가await경계를 넘지 않는 한 이 오류가 발생하지 않고 비동기 메서드에서 허용됩니다. -
return-returning 메서드의void결과를 반환하는 문을 제거하거나 호출된 메서드를 변경하여 값을 반환합니다(CS4029). 값으로 반환할 수 있는 형식이 아니므로return SomeVoidMethod();사용할void수 없습니다. 키워드를return제거하고 메서드를 독립 실행형 문으로 호출하거나 호출된 메서드의 서명을 변경하여 구체적인 형식을 반환합니다. - 비동기 메서드(
[SecurityCritical])와 같은[SecuritySafeCritical]보안 특성을 제거하거나 이러한 특성으로 표시된 형식의 메서드에서 한정자를 제거async합니다(CS4031). 코드 액세스 보안 주석은 선언 메서드에 적용되지만 컴파일러에서 생성된 비동기 상태 컴퓨터는 해당 보안 주석을 적용할 수 없는 별도의 컨텍스트에서 실행됩니다.
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET