Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek se zabývá následujícími chybami kompilátoru:
-
CS1983: Vzhledem k tomu, že se jedná o asynchronní metodu, musí být návratový výraz typu '
T' namísto 'Task<T>'. - CS1985: V klauzuli catch nelze očekávat.
-
CS1986: "
await' vyžaduje, aby typ měl vhodnou metodu 'GetAwaiter'. - CS1989: Asynchronní výrazy lambda nelze převést na stromy výrazů.
- CS1991: Type nemůže implementovat událost, protože se jedná o událost prostředí Windows Runtime a událost je běžnou událostí .NET.
-
CS1992: Operátor '
await' lze použít pouze v případech, kdy je obsažen v metodě nebo výrazu lambda označeném modifikátorem "async". -
CS1994: Modifikátor '
async' lze použít pouze v metodách, které mají tělo. -
CS1995: Operátor '
await' lze použít pouze ve výrazu dotazu v prvním výrazu kolekce počáteční klauzule 'from' nebo v rámci výrazu kolekce klauzule 'join'. - CS1996: V těle příkazu lock nelze použít await.
- CS1997: Vzhledem k tomu, že funkce je asynchronní metoda, která vrací hodnotu, nesmí být za vráceným klíčovým slovem následovat výraz objektu.
-
CS1998: Tato asynchronní metoda nemá operátory '
await' a spustí se synchronně. Zvažte použití operátoru 'await' k čekání na neblokující volání rozhraní API neboawait Task.Run(...)k provedení práce vázané na procesor na vlákně na pozadí. - CS4001: Výraz nelze očekávat.
-
CS4003: '
await' nelze použít jako identifikátor v asynchronní metodě nebo výrazu lambda. - CS4005: Asynchronní metody nemohou mít parametry typu ukazatele.
- CS4006: __arglist není v seznamu parametrů asynchronních metod povolena.
-
CS4007: Instanci typu nelze zachovat přes hranici '
await' nebo 'yield'. -
CS4008: Nelze očekávat '
void'. - CS4009: Vstupní bod s návratovým typem void nebo int nemůže být async.
- CS4010: Nelze převést asynchronní výraz na typ delegáta. Asynchronní výraz může vrátit hodnotu void, Task nebo Task<T>, z nichž žádný není převoditelný na typ.
-
CS4011: '
await' vyžaduje, aby návratový typ '{1}.GetAwaiter()' měl vhodné členy IsCompleted, OnCompleted a GetResult, a implementoval INotifyCompletion nebo ICriticalNotifyCompletion. - CS4012: Parametry typu nelze deklarovat v asynchronních metodách nebo asynchronních výrazech lambda.
-
CS4014: Protože toto volání není očekáváno, provádění aktuální metody pokračuje před dokončením volání. Zvažte použití
awaitoperátoru na výsledek volání. - CS4015: MetodaImplOptions.Synchronized nelze použít pro asynchronní metodu.
- CS4016: Vzhledem k tomu, že se jedná o asynchronní metodu, musí být návratový výraz typu podobného úloze, nikoliv deklarovaný typ.
- CS4027: Typ výrazu neimplementuje požadovaný člen.
-
CS4028: "
await' vyžaduje, aby typ měl vhodnou metodu GetAwaiter. Chybí vám direktiva using pro systém? - CS4029: Nelze vrátit výraz typu "void".
- CS4030: Atribut zabezpečení nelze použít u asynchronní metody.
- CS4031: Asynchronní metody nejsou povoleny v rozhraní, třídě nebo struktuře, která má atribut SecurityCritical nebo SecuritySafeCritical.
-
CS4032: Operátor '
await' lze použít pouze v asynchronní metodě. Zvažte označení této metody modifikátorem "async" a změňte jeho návratový typ na "Task<T>". -
CS4033: Operátor '
await' lze použít pouze v asynchronní metodě. Zvažte označení této metody modifikátorem 'async' a změnou jeho návratového typu na "Task". -
CS4034: Operátor '
await' lze použít pouze v asynchronní metodě. Zvažte označení této metody modifikátorem "async". - CS8031: Asynchronní výraz lambda převedený na delegáta vracející úkol nemůže vrátit hodnotu.
-
CS8100: Operátor '
await' nelze použít v inicializátoru proměnných statického skriptu. - CS8177: Asynchronní metody nemohou mít lokální proměnné předané podle odkazu.
-
CS8178: Odkaz vrácený voláním metody nelze zachovat přes hranici '
await' nebo 'yield'. - CS8204: Typ, který se má použít jako AsyncMethodBuilder pro cíl typu, by jeho Task vlastnost měla vrátit cílový typ místo deklarovaného typu.
-
CS8403: Metoda s blokem iterátoru musí být deklarována jako '
async', aby vracela IAsyncEnumerable<T>. - CS8411: Asynchronní příkaz foreach nemůže pracovat s proměnnými typu, protože typ neobsahuje vhodnou veřejnou instanci nebo definici rozšíření pro požadovaný člen.
- CS8892: Metoda nebude použita jako vstupní bod, protože byl nalezen synchronní vstupní bod.
- CS8935: Atribut AsyncMethodBuilder je zakázán u anonymních metod bez explicitního návratového typu.
- CS8940: Byl očekáván obecný návratový typ podobný úkolu, ale typ nalezený v atributu AsyncMethodBuilder nebyl vhodný. Musí to být nevázaný obecný typ arity jeden a jeho obsahující typ (pokud existuje) musí být ne generický.
-
CS9123: Operátor '
&' by neměl být použit u parametrů nebo místních proměnných v asynchronních metodách. -
CS9330: '
MethodImplAttribute.Async' nelze ručně použít na metody. Označte metodu "async".
Požadavky výrazu Await
- CS1985: V klauzuli catch nelze očekávat.
-
CS1986: "
await' vyžaduje, aby typ měl vhodnou metodu 'GetAwaiter'. -
CS1992: Operátor '
await' lze použít pouze v případech, kdy je obsažen v metodě nebo výraz lambda označený modifikátorem 'async'. -
CS1995: Operátor '
await' lze použít pouze ve výrazu dotazu v prvním výrazu kolekce počáteční klauzule 'from' nebo v rámci výrazu kolekce klauzule 'join'. - CS1996: V textu příkazu lock nelze čekat.
-
CS4008: Nelze čekat na '
void'. -
CS4032: Operátor '
await' lze použít pouze v asynchronní metodě. Zvažte označení této metody modifikátorem 'async' a změnou jeho návratového typu na "Task<T>". -
CS4033: Operátor '
await' lze použít pouze v asynchronní metodě. Zvažte označení této metody modifikátorem 'async' a změnou jeho návratového typu na "Task". -
CS4034: Operátor '
await' lze použít pouze v asynchronní metodě. Zvažte označení této metody modifikátorem "async". -
CS8178: Odkaz vrácený tímto voláním nelze zachovat přes hranici '
await' nebo 'yield'. - CS8411: Asynchronní příkaz foreach nemůže pracovat s proměnnými typu, protože typ neobsahuje vhodnou veřejnou instanci nebo definici rozšíření pro požadovaný člen.
- CS4001: Výraz nelze očekávat.
-
CS4003: '
await' nelze použít jako identifikátor v asynchronní metodě nebo výrazu lambda. -
CS4007: Instanci typu nelze zachovat přes hranici '
await' nebo 'yield'. -
CS4011: '
await' vyžaduje, aby návratový typ 'GetAwaiter()' měl vhodné členy 'IsCompleted', 'OnCompleted' a 'GetResult' a implementoval 'INotifyCompletion' nebo 'ICriticalNotifyCompletion'. - CS4027: Typ neimplementuje požadovaný člen.
-
CS4028: "
await' vyžaduje, aby typ měl vhodnou metodu GetAwaiter. Chybí vám direktiva using pro systém? -
CS8100: Operátor '
await' nelze použít v inicializátoru proměnných statického skriptu.
Následující položky vysvětlují, jak opravit jednotlivé chyby. Další informace o operátoruawait a vzoru awaiter naleznete v tématu Asynchronní programování pomocí async a await.
-
asyncPřidejte modifikátor do metody nebo výrazu lambda, který obsahujeawaitvýraz (CS1992, CS4032, CS4033, CS4034). Kompilátor vyžadujeasyncmodifikátor, aby mohl vygenerovat stavový počítač, který zpracovává asynchronní pozastavení a obnovení. Tři varianty této chyby poskytují návrhy specifické pro kontext pro správný návratový typ. - Přesuňte
awaitvýrazy zcatchbloků, pokud cílujete na C# 5 nebo starší (CS1985). Počínaje jazykem C# 6 kompilátor podporujeawaitv oboucatchifinallyblocích. Tato chyba se už neprodukuje v jazyce C# 6 a novějším. - Přesuňte
awaitvýrazy zlockpříkazových bloků (CS1996) Asynchronní pozastavení při držení zámku riskuje zablokování. Zámek se uchovává napříč přepínači vláken, kde jiný kód může čekat na stejný zámek. - Restrukturalizovat výrazy dotazu tak, aby
awaitobjevují se pouze v prvním výrazu kolekce počátečnífromklauzule nebo ve výrazu kolekce klauzulejoin(CS1995). Jiné klauzule dotazu se překládají na výrazy lambda, které nepodporují asynchronní pozastavení. - Změňte typ očekávaného výrazu tak, aby zpřístupnil přístupnou
GetAwaiter()metodu, která se řídí vzorem awaiter (CS1986, CS4028). Typ může implementovat vzor přímo nebo prostřednictvím rozšiřující metody.GetAwaiterPokud metoda existuje, ale chybí pro vás direktivausingSystem, kompilátor vytvoří konkrétnější zprávu CS4028 místo CS1986. - Ujistěte se, že typ awaiter vrácený má
GetAwaiter()IsCompleted,OnCompletedaGetResultčleny a implementuje INotifyCompletion nebo ICriticalNotifyCompletion (CS4011, CS4027). Výrazawaitzávisí na těchto členech, aby zkontrolovali stav dokončení, zaregistrovali pokračování a načetli výsledky. - Změňte návratový typ volané metody z
voidna Task nebo Task<TResult>, aby mohl být výsledek očekáván (CS4008). Nelze očekávat metodu vracejícívoid, protože neexistuje úkolový objekt pro sledování dokončení a šíření výjimek. - Změňte očekávaný výraz na typ, který podporuje vzor awaiteru (CS4001). Typy jako
int,stringa jiné předdefinované typy nemají metoduGetAwaitera nelze je očekávat přímo. - Před použitím (
await) uložte výsledek volání metody vrácení odkazu do místní proměnné. Odkaz vrácený metodou nelze zachovat v rámciawaithranice, protože asynchronní stavový počítač může pozastavit a pokračovat v jiném vlákně nebo kontextu a zneplatnit odkaz. - Implementujte IAsyncEnumerable<T> na typu kolekce, nebo přidejte přístupnou metodu
GetAsyncEnumerator, která vrací typ s členyCurrentaMoveNextAsync(CS8411). Příkazawait foreachvyžaduje , aby typ kolekce sledoval asynchronní enumerovatelný vzor. - Přejmenujte libovolnou místní proměnnou nebo parametr pojmenovaný
awaituvnitř metody nebo výrazuasynclambda (CS4003). Uvnitř asynchronních kontextůawaitje kontextové klíčové slovo, které nelze použít jako identifikátor. -
awaitPřesuňte výraz z inicializátoru statické proměnné skriptu do těla metody (CS8100). Statické inicializátory se spouští mimo asynchronní kontext, takžeawaitv tomto umístění není k dispozici. - Změna struktury kódu tak, aby
ref structinstance nemusely být zachovány napříč hranicemiawaityield(CS4007). Asynchronní stavový počítač ukládá místní proměnné do haldy aref structtypy jsou vázané podle návrhu – nelze je bezpečně přesunout do úložiště haldy napříč body pozastavení.
Požadavky na podpis asynchronní metody
-
CS1983: Vzhledem k tomu, že se jedná o asynchronní metodu, musí být návratový výraz typu T, nikoli "
Task<T>". -
CS1994: Modifikátor '
async' lze použít pouze v metodách, které mají tělo. - CS4009: Vstupní bod vracející void nebo int nemůže být asynchronní.
- CS8892: Metoda nebude použita jako vstupní bod, protože byl nalezen synchronní vstupní bod.
- CS8935: Atribut AsyncMethodBuilder je zakázán u anonymních metod bez explicitního návratového typu.
- CS8940: Byl očekáván obecný návratový typ podobný úkolu, ale typ nalezený v atributu AsyncMethodBuilder nebyl vhodný. Musí to být nevázaný obecný typ arity jeden a jeho obsahující typ (pokud existuje) musí být ne generický.
-
CS8403: Metoda s iterátorovým blokem musí být '
async', aby se vrátil '{1}'. -
CS9330: '
MethodImplAttribute.Async' nelze ručně použít na metody. Označte metodu 'async'. - CS4005: Asynchronní metody nemohou mít parametry typu ukazatele.
- CS4006: __arglist není v seznamu parametrů asynchronních metod povolena.
- CS4010: Nelze převést asynchronní lambda na typ delegáta. Asynchronní lambda může vrátit hodnotu void, Task nebo Task<T>, které nelze převést na návratový typ.
- CS4012: Parametry typu nelze deklarovat v asynchronních metodách nebo asynchronních výrazech lambda.
- CS4015: MetodaImplOptions.Synchronized nelze použít pro asynchronní metodu.
- CS4016: Vzhledem k tomu, že se jedná o asynchronní metodu, musí mít výraz návratu typ Task, nikoliv jiný typ.
- CS8031: Asynchronní výraz lambda převedený na delegáta vracejícího objekt `Task` nesmí vrátit hodnotu.
- CS8204: Typ, který se má použít jako AsyncMethodBuilder pro typ, by jeho Task vlastnost měla vrátit požadovaný typ místo deklarovaného typu.
Následující položky vysvětlují, jak opravit jednotlivé chyby. Další informace o deklarcích asynchronní metody naleznete v modifikátoru async a asynchronní návratové typy.
- Změňte návratový výraz tak, aby odpovídal základnímu typu výsledku asynchronní metody (CS1983, CS4016). Když asynchronní metoda vrátí
Task<T>,returnpříkaz musí zadat hodnotu typuT, neTask<T>, protože kompilátorem vygenerovaný stavový automat zabalí hodnotu do úlohy automaticky. CS1983 se zobrazí, když metoda vrátíTask<T>a výraz jeT; CS4016 popisuje obecný případ, kdy se typ návratového výrazu neshoduje. - Odeberte modifikátor
asyncz metod, které nemají tělo, například z abstraktních metod nebo deklarací metod rozhraní (CS1994).asyncModifikátor vyžaduje tělo metody, aby kompilátor mohl vygenerovat implementaci stavového počítače. - Změňte návratový typ asynchronního vstupního bodu na Task nebo Task<TResult> (CS4009). Od verze C# 7.1 může být metoda
, ale musí vracetnebo a nejsou platnými podpisy vstupního bodu. - Odeberte nebo přejmenujte jeden vstupní bod, pokud projekt obsahuje synchronní i asynchronní
Mainmetodu (CS8892). Kompilátor vybere synchronní vstupní bod a vydá toto upozornění pro asynchronního kandidáta, který ignoruje. - Před použitím atributu (
[AsyncMethodBuilder]) přidejte do výrazu lambda explicitní návratový typ. Kompilátor nemůže přeložit typ tvůrce pro anonymní metodu, jejíž návratový typ je odvozen, protože atribut musí být spárován s konkrétním návratovým typem v době kompilace. - Změňte typ zadaný v atributu
[AsyncMethodBuilder]na nevázaný obecný typ arity jedna, napříkladMyTaskMethodBuilder<>spíše nežMyTaskMethodBuilder<T>nebo negenerický typ (CS8940). Typ, který tvůrce obsahuje, pokud existuje, musí být rovněž negenerický. Kompilátor vyžaduje tento tvar, aby mohl sestavit sestavovač pro jakýkoli konkrétní návratový typ podobný úloze. - Nahraďte ruční
[MethodImpl(MethodImplOptions.Async)]atribut klíčovým slovemasyncv deklaraci metody (CS9330). PříznakMethodImplOptions.Asyncje vyhrazený pro interní použití modulu runtime a nedá se použít přímo v uživatelském kódu. -
asyncPřidejte modifikátor do metod, které obsahují bloky iterátoru a návrat IAsyncEnumerable<T> nebo IAsyncEnumerator<T> (CS8403). Bez modifikátoruasynckompilátor považuje metodu za synchronní iterátor a nemůže vygenerovat počítač se stavem asynchronního datového proudu. - Odeberte parametry typu ukazatele z asynchronních metod (CS4005). Ukazatele odkazují na pevná umístění paměti, která se nedají bezpečně zachovat v asynchronních bodech pozastavení, kde může provádění pokračovat v jiném vlákně.
- Odeberte
__arglistze seznamů parametrů asynchronní metody (CS4006). Seznamy argumentů s proměnnou délkou závisí na konvencích volání založených na zásobníku, které nejsou kompatibilní s asynchronním stavovým počítačem přiděleným haldou. - Odeberte
ref,innebo parametryouta parametry typů jakoref structnebo Span<T>z asynchronních ReadOnlySpan<T> metod nebo asynchronních výrazů lambda (CS4012). Tyto typy parametrů jsou navázané na zásobník a nelze je bezpečně zachytit v uzavření asynchronního stavového stroje alokovaného na haldě. - Změňte typ cílového delegáta tak, aby odpovídal návratovém typu asynchronního lambda (CS4010). Asynchronní lambda může vrátit
void, Task nebo Task<TResult>, a kompilátor je nemůže převést na libovolné typy delegátů, které očekávají různé návratové typy. -
returnOdeberte výraz z asynchronního lambda, který je přiřazený ne generickémuTaskdelegátovi , nebo změňte typ delegáta takFunc<Task<T>>, aby lambda mohl vrátit hodnotu (CS8031). NegenerickýTask-delegát představuje asynchronní operaci bez výsledku, takže vrácení hodnoty je nesoulad typů. - Odeberte atribut
[MethodImpl(MethodImplOptions.Synchronized)]z asynchronních metod (CS4015). VolbaSynchronizedzíská zámek pro celou dobu spuštění metody, ale asynchronní metoda může být pozastavena a znovu obnovena na různých vláknech, což činí sémantiku zámku nejasnou. - Opravte vlastní
AsyncMethodBuildertyp tak, aby jehoTaskvlastnost vrátila stejný typ jako deklarovaný návratový typ asynchronní metody (CS8204). Kompilátor používá vlastnost tvůrceTaskk získání konečného objektu úkolu, takže neshoda typu brání tomu, aby stavový počítač fungoval správně.
Asynchronní postupy
- CS1989: Asynchronní výrazy lambda nelze převést na stromy výrazů.
- CS1991: Type nemůže implementovat událost, protože se jedná o událost prostředí Windows Runtime a událost je běžnou událostí .NET.
- CS1997: Vzhledem k tomu, že funkce je asynchronní metoda, která vrací hodnotu, nesmí být za vráceným klíčovým slovem následovat výraz objektu.
-
CS1998: Tato asynchronní metoda nemá operátory '
await' a spustí se synchronně. Zvažte použití operátoru 'await' k čekání na neblokující volání rozhraní API neboawait Task.Run(...)k provedení práce vázané na procesor na vlákně na pozadí. -
CS4014: Protože toto volání není očekáváno, provádění aktuální metody pokračuje před dokončením volání. Zvažte použití
awaitoperátoru na výsledek volání. - CS8177: Asynchronní metody nemohou mít místní hodnoty podle odkazu.
-
CS9123: Operátor '
&' by neměl být použit u parametrů nebo místních proměnných v asynchronních metodách. - CS4029: Nelze vrátit výraz typu "void".
- CS4030: Atribut zabezpečení nelze použít u asynchronní metody.
- CS4031: Asynchronní metody nejsou povoleny v rozhraní, třídě nebo struktuře, která má atribut SecurityCritical nebo SecuritySafeCritical.
Následující položky vysvětlují, jak opravit jednotlivé chyby. Další informace naleznete v tématu Asynchronní programování pomocí async a await a await Operátor.
- Přidejte operátor
awaitk každému volání, které vrátí Task nebo Task<TResult>, nebo explicitně zahodí výsledek s_ =, pokud je skutečně zamýšleno chování ohně-a-zapomenutí (CS4014). Bezawait, všechny výjimky vyvolané asynchronní operací jsou bez povšimnutí ztraceny a volající metoda pokračuje v provádění před dokončením operace, což může způsobit nenápadné chyby v pořadí a správnosti. - Odeberte výraz
returnz asynchronní metody, jejíž návratový typ jeTask(negenerický), nebo změňte návratový typ naTask<T>, když metoda potřebuje vrátit hodnotu (CS1997). V asynchronní metodě, která vrátíTask, kompilátor vygeneruje obal úkolu – vrácení hodnoty je nesoulad typu, protože podpis metody slibuje žádný výsledek. - Přidejte do těla metody alespoň jeden
awaitvýraz nebo odeberteasyncmodifikátor a vraťte úlohu přímo (CS1998). Metodaasyncbez jakýchkoliawaitvýrazů se spouští zcela synchronně, což přidává zbytečnou režii stavového automatu. Pokud metoda záměrně zabalí synchronní operaci, odebráníasynca vrácení úlohy explicitně eliminuje danou režii. - Přepište výraz lambda tak, aby nepoužívalo
asynckdyž je přiřazen k typu strom výrazu jakoExpression<Func<...>>(CS1989). Stromy výrazů představují kód jako datové struktury, které může kompilátor analyzovat nebo překládat, ale komplexní stavový počítač, kterýasyncvytváří, nelze zachytit ve stromu výrazů. - Změňte implementaci události tak, aby deklarace rozhraní i implementační třída odsouhlasily, zda událost používá sémantiku prostředí Windows Runtime nebo pravidelnou sémantiku .NET (CS1991). Tato chyba se týká scénářů interoperability prostředí Windows Runtime, kdy se událost WinRT nedá implementovat jako běžná událost .NET nebo naopak.
- Odeberte operátor adresy (
&) z výrazů, které odkazují na parametry nebo místní proměnné uvnitř asynchronních metod (CS9123). Asynchronní stavový počítač může během pozastavení přemístit zachycené proměnné do haldy, což zneplatní jakýkoli ukazatel získaný prostřednictvím adresy. - Odeberte místní proměnné předávané odkazem z asynchronních metod nebo se ujistěte, že nepřesahují hranice
await(CS8177). Asynchronní stavový počítač zachytává místní proměnné v uzávěrech přidělených haldou a odkazy na umístění zásobníku se nedají bezpečně zachovat napříč body pozastavení. V jazyce C# 13 a novějších jsou lokální proměnné povolené v asynchronních metodách, pokud nepřesahují hranicerefa tato chyba se neobjeví. -
returnOdeberte příkaz, který vrací výsledekvoidmetody -returning, nebo změňte volanou metodu tak, aby vrátila hodnotu (CS4029). Nemůžete použítreturn SomeVoidMethod();, protoževoidnení typem, který se dá vrátit jako hodnota. Buď odebertereturnklíčové slovo a zavolejte metodu jako samostatný příkaz, nebo změňte jeho podpis tak, aby vrátil konkrétní typ. - Odeberte atributy zabezpečení jako
[SecurityCritical]nebo[SecuritySafeCritical]z asynchronních metod (CS4030) nebo odeberteasyncmodifikátor z metod v typech označených těmito atributy (CS4031). Poznámky zabezpečení přístupu kódu platí pro deklarující metodu, ale kompilátorem vygenerovaný asynchronní stavový počítač běží v samostatném kontextu, kde tyto poznámky zabezpečení nelze vynutit.