Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk a következő fordítóhibákat ismerteti:
-
CS1983: Mivel ez egy aszinkron metódus, a visszatérési kifejezésnek "" helyett
T"Task<T>" típusúnak kell lennie. - CS1985: Nem lehet await kifejezést használni a fogási záradékban.
-
CS1986: A "
await" megköveteli, hogy a típus megfelelő ""GetAwaitermetódussal rendelkezzen. - CS1989: Az aszinkron lambda kifejezések nem konvertálhatók kifejezésfákká.
- CS1991: A "Type" nem tudja implementálni az "eseményt", mert windowsos futtatókörnyezeti esemény, az "esemény" pedig egy normál .NET-esemény.
-
CS1992: A "
await" operátor csak akkor használható, ha az "async" módosítóval megjelölt metódusban vagy lambda kifejezésben található. -
CS1994: A "
async" módosító csak olyan metódusokban használható, amelyekben van törzs. -
CS1995: A "
await" operátor csak a kezdeti "from" záradék első gyűjteménykifejezésében vagy egy "join" záradék gyűjteménykifejezésében használható lekérdezési kifejezésben. - CS1996: Az await utasítás nem használható a lock utasítás törzsében.
- CS1997: Mivel a függvény egy aszinkron metódus, amely egy értéket ad vissza, a visszaadott kulcsszót nem szabad objektumkifejezéssel követni.
-
CS1998: Ez az aszinkron metódus nem rendelkezik "
await" operátorokkal, és szinkronban fog futni. Fontolja meg a "await" operátor használatát a nem blokkoló API-hívásokra való várakozáshoz, vagy "await Task.Run(...)" a processzorhoz kötött munka elvégzésére egy háttérszálon. - CS4001: Nem várható meg a kifejezés.
-
CS4003: A "
await" nem használható azonosítóként aszinkron metóduson vagy lambdakifejezésen belül. - CS4005: Az aszinkron metódusok nem rendelkeznek mutatótípus-paraméterekkel.
- CS4006: __arglist nem engedélyezett az aszinkron metódusok paraméterlistájában.
-
CS4007: A típuspéldányok nem őrizhetők meg a "
await" vagy a "yield" határvonalon. -
CS4008: Nem lehet várni a következőt: ""
void. - CS4009: A void vagy int visszatérési típusú belépési pont nem lehet aszinkron.
- CS4010: Az aszinkron kifejezés nem konvertálható delegált típussá. Az aszinkron kifejezés void, Task vagy Task<T> típusú lehet, amelyek közül egyik sem konvertálható a delegált típusba.
-
CS4011: A '
await' megköveteli, hogy a "{1}.GetAwaiter()" visszatérési típusa rendelkezzen megfelelő 'IsCompleted', 'OnCompleted' és 'GetResult' tagokkal, és valósítsa meg az 'INotifyCompletion' vagy 'ICriticalNotifyCompletion' interfészeket. - CS4012: A típusparaméterek nem deklarálhatók aszinkron metódusokban vagy aszinkron lambdakifejezésekben.
-
CS4014: Mivel ez a hívás nem várható, az aktuális metódus végrehajtása a hívás befejezése előtt folytatódik. Fontolja meg az
awaitoperátor alkalmazását a hívás eredményére. - CS4015: A "MethodImplOptions.Syncd" nem alkalmazható aszinkron metódusra.
- CS4016: Mivel ez egy aszinkron metódus, a visszatérési kifejezésnek feladat típusúnak kell lennie a deklarált típus helyett.
- CS4027: A kifejezés típusa nem implementálja a szükséges tagot.
-
CS4028: A ""
awaitmegköveteli, hogy a típus megfelelő GetAwaiter metódussal rendelkezzen. Hiányzik a "System" használatára vonatkozó irányelv? - CS4029: Nem adható vissza "void" típusú kifejezés.
- CS4030: A biztonsági attribútum nem alkalmazható aszinkron metódusra.
- CS4031: Az aszinkron metódusok nem engedélyezettek a SecurityCritical vagy SecuritySafeCritical attribútummal rendelkező interfészben, osztályban vagy struktúrában.
-
CS4032: A "
await" operátor csak aszinkron metóduson belül használható. Fontolja meg a metódus "async" módosítóval való megjelölését, és módosítsa visszatérési típusát ""Task<T>-ra. -
CS4033: A "
await" operátor csak aszinkron metóduson belül használható. Fontolja meg a metódus megjelölését a "async" módosítóval, és módosítsa visszatérési típusát ""Task-ra. -
CS4034: A "
await" operátor csak aszinkron metóduson belül használható. Érdemes lehet megjelölni ezt a metódust az "async" módosítóval. - CS8031: Egy feladattal értéket visszaadó delegálttá konvertált aszinkron lambda kifejezés nem tud értéket visszaadni.
-
CS8100: A "
await" operátor nem használható statikus szkriptváltozó inicializálójában. - CS8177: Az aszinkron metódusok nem rendelkeznek hivatkozási helyi adatokkal.
-
CS8178: A metódushívás által visszaadott hivatkozás nem őrizhető meg a "" vagy a
await"yield" határvonalon. - CS8204: A típuscél AsyncMethodBuilderként való használatához a Tevékenység tulajdonságnak céltípust kell visszaadnia a deklarált típus helyett.
-
CS8403: Az iterátorblokkot tartalmazó metódusnak ""
asynckell lennie az IAsyncEnumerable<T> visszaadásához. - CS8411: Az aszinkron foreach utasítás nem működik típusváltozókon, mert a típus nem tartalmaz megfelelő nyilvános példány- vagy bővítménydefiníciót a szükséges taghoz.
- CS8892: A metódus nem használható belépési pontként, mert szinkron belépési pont található.
- CS8935: Az AsyncMethodBuilder attribútum explicit visszatérési típus nélkül nem engedélyezett a névtelen metódusokon.
- CS8940: Általános feladathoz hasonló visszatérési típus várt, de az AsyncMethodBuilder attribútumban talált típus nem volt megfelelő. Kötetlen általános aritástípusnak kell lennie, és a benne található típusnak (ha van ilyen) nem általánosnak kell lennie.
-
CS9123: A "
&" operátor nem használható paramétereken vagy helyi változókon az aszinkron metódusokban. -
CS9330: A "
MethodImplAttribute.Async" nem alkalmazható manuálisan a metódusokra. Jelölje meg az "async" metódust.
Várjon kifejezési követelményekre
- CS1985: Az 'await' nem használható a catch záradékban.
-
CS1986: A "
await" megköveteli, hogy a típus megfelelő ""GetAwaitermetódussal rendelkezzen. -
CS1992: A "
await" operátor csak akkor használható, ha a "async" módosítóval megjelölt metódusban vagy lambda kifejezésben szerepel. -
CS1995: A "
await" operátor csak a kezdeti "from" záradék első gyűjteménykifejezésében vagy egy "join" záradék gyűjteménykifejezésében használható lekérdezési kifejezésben. - CS1996: Nem lehet await-et használni a zárolási utasítás törzsében.
-
CS4008: Nem lehet várakozni erre: '
void'. -
CS4032: A "
await" operátor csak aszinkron metóduson belül használható. Fontolja meg a metódus megjelölését a "async" módosítóval, és módosítsa visszatérési típusát ""Task<T>-ra. -
CS4033: A "
await" operátor csak aszinkron metóduson belül használható. Fontolja meg a metódus megjelölését a "async" módosítóval, és módosítsa visszatérési típusát ""Task-ra. -
CS4034: A "
await" operátor csak aszinkron metóduson belül használható. Érdemes lehet megjelölni ezt a metódust az "async" módosítóval. -
CS8178: A hívás által visszaadott hivatkozás nem őrizhető meg a "
await" vagy a "yield" határon. - CS8411: Az aszinkron foreach utasítás nem működik típusváltozókon, mert a típus nem tartalmaz megfelelő nyilvános példány- vagy bővítménydefiníciót a szükséges taghoz.
- CS4001: Nem várható meg a kifejezés.
-
CS4003: A "
await" nem használható azonosítóként aszinkron metóduson vagy lambdakifejezésen belül. -
CS4007: A típuspéldányok nem őrizhetők meg a "
await" vagy a "yield" határvonalon. -
CS4011: A ""
awaitmegköveteli, hogy a "GetAwaiter()" visszatérési típusa megfelelő "IsCompleted", "OnCompleted" és "GetResult" tagokkal rendelkezzen, és implementálja az "INotifyCompletion" vagy az "ICriticalNotifyCompletion" kifejezést. - CS4027: A típus nem implementálja a szükséges tagot.
-
CS4028: A ""
awaitmegköveteli, hogy a típus megfelelő GetAwaiter metódussal rendelkezzen. Hiányzik a "System" használatára vonatkozó irányelv? -
CS8100: A "
await" operátor nem használható statikus szkriptváltozó inicializálójában.
Az alábbi elemek bemutatják, hogyan lehet kijavítani az egyes hibákat. Az await operátorról és a várakoztató mintáról további információt az Aszinkron programozás async és await használatával című témakörben talál.
- Adja hozzá a
asyncmódosítót a kifejezést tartalmazóawaitmetódushoz vagy lambda kifejezéshez (CS1992, CS4032, CS4033, CS4034). A fordítónak szüksége van aasyncmódosítóra, hogy létrehozhassa az aszinkron felfüggesztést és újrakezdést kezelő állapotgépet. A hiba három változata környezetspecifikus javaslatokat ad a helyes visszatérési típusra. - Amikor a C# 5 vagy korábbi verziót célozza meg (
await), helyezze át acatchkifejezéseket a blokkokból. A C# 6-tól kezdve a fordító mindkétawaitesetben éscatchblokkokban is támogatjafinally. Ez a hiba már nem a C# 6-os és újabb verzióiban jön létre. - Kifejezések áthelyezése
awaitutasításblokkokbóllock(CS1996). A zárolás megtartása közben az aszinkron felfüggesztés holtpontot jelent. A zárolás akkor is fennmarad, amikor szálváltások történnek, ahol más kód is ugyanarra a zárolásra vár. - Alakítsa át a lekérdezési kifejezéseket úgy, hogy
awaitcsak a kezdetifromzáradék első gyűjteménykifejezésében vagy egyjoinzáradék gyűjteménykifejezésében (CS1995) jelenjenek meg. Más lekérdezési záradékok lambda-kifejezésekké alakulnak, amelyek nem támogatják az aszinkron felfüggesztést. - Módosítsa a várt kifejezés típusát úgy, hogy egy
GetAwaiter()metódust tegyen elérhetővé, amely a várómintát követi (CS1986, CS4028). A típus közvetlenül vagy bővítménymetódussal implementálhatja a mintát. Ha aGetAwaitermetódus létezik, de hiányzik egyusingirányelv,Systema fordító a CS1986 helyett a pontosabb CS4028-üzenetet hozza létre. - Győződjön meg arról, hogy a
GetAwaiter()által visszaadott várótípus rendelkezikIsCompleted,OnCompletedésGetResulttagokkal, valamint megvalósítja a INotifyCompletion vagy ICriticalNotifyCompletion interfészt (CS4011, CS4027). Aawaitkifejezés ezektől a tagoktól függ a befejezési állapot ellenőrzéséhez, a folytatások regisztrálásához és az eredmények lekéréséhez. - Módosítsa a meghívott függvény visszatérési típusát
void-ről Task-re vagy Task<TResult>-re, hogy az eredmény várható legyen (CS4008). Nem várhat meg egyvoid-értéket visszaadó metódust, mert nincs feladatobjektum a befejezés nyomon követésére vagy a kivételek továbbítására. - Módosítsa a várt kifejezést olyan típusra, amely támogatja a várómintát (CS4001). Az olyan típusok, mint a
int,string, és más beépített típusok nem rendelkeznek a(z)GetAwaitermetódussal, és nem lehet őket közvetlenül várakozási állapotba helyezni. - A ref-returning metódushívás eredményét egy helyi változóban tárolja a használat
awaitelőtt (CS8178). A metódus által visszaadott hivatkozás nem őrizhető meg egyawaithatárán, mert az aszinkron állapotgép különböző szálon vagy környezetben függesztheti fel és folytathatja, így a hivatkozás érvénytelenné válik. - Valósítsa meg a IAsyncEnumerable<T> a gyűjtemény típusán, vagy adjon hozzá egy elérhető
GetAsyncEnumeratormetódust, amely egy típust ad visszaCurrentésMoveNextAsynctagokkal (CS8411). Azawait foreachutasítás megköveteli, hogy a gyűjtemény típusa kövesse az aszinkron számbavételi mintát. - Nevezze át a
awaitmetódusban vagy lambdakifejezésben (async) elnevezett helyi változót vagy paramétert. Az aszinkron környezetekben aawaitkörnyezetfüggő kulcsszóként szerepel, ezért nem használható azonosítóként. - Helyezze át a kifejezést a
awaitstatikus szkriptváltozó inicializálóból és egy metódustörzsbe (CS8100). A statikus inicializálók aszinkron környezeten kívül futnak, ezértawaitnem érhetők el ezen a helyen. - Alakítsa át a kódot úgy, hogy a
ref structpéldányokat ne kelljenawaitvagyyieldhatárokon (CS4007) megőrizni. Az aszinkron állapotú gép a halomon tárolja a helyi változókat, aref structtípusokat pedig a tervezés köti össze – nem helyezhetők át biztonságosan a halomtárolóba a felfüggesztési pontok között.
Az Async metódus aláírási követelményei
-
CS1983: Mivel ez egy aszinkron metódus, a visszatérési kifejezésnek nem "T" típusúnak, hanem "
Task<T>T" típusúnak kell lennie. -
CS1994: A "
async" módosító csak olyan metódusokban használható, amelyekben van törzs. - CS4009: Void vagy int visszatérési értékkel rendelkező belépési pont nem lehet aszinkron.
- CS8892: A metódus nem használható belépési pontként, mert szinkron belépési pont található.
- CS8935: Az AsyncMethodBuilder attribútum explicit visszatérési típus nélkül nem engedélyezett a névtelen metódusokon.
- CS8940: Általános feladathoz hasonló visszatérési típus várt, de az AsyncMethodBuilder attribútumban talált típus nem volt megfelelő. Kötetlen általános aritástípusnak kell lennie, és a benne található típusnak (ha van ilyen) nem általánosnak kell lennie.
-
CS8403: Az iterátorblokkot tartalmazó metódusnak a "
async{1}" értéket kell visszaadnia. -
CS9330: A "
MethodImplAttribute.Async" nem alkalmazható manuálisan a metódusokra. Jelölje meg a ""asyncmetódust. - CS4005: Az aszinkron metódusok nem rendelkeznek mutatótípus-paraméterekkel.
- CS4006: __arglist nem engedélyezett az aszinkron metódusok paraméterlistájában.
- CS4010: Az aszinkron lambda nem konvertálható delegált típussá. Az aszinkron lambda void, Task vagy Task<T>, amelyek egyike sem konvertálható visszatérési típussal.
- CS4012: A típusparaméterek nem deklarálhatók aszinkron metódusokban vagy aszinkron lambdakifejezésekben.
- CS4015: A "MethodImplOptions.Syncd" nem alkalmazható aszinkron metódusra.
- CS4016: Mivel ez egy aszinkron metódus, a visszatérési kifejezésnek feladattípusúnak kell lennie, nem pedig típusnak.
- CS8031: Az aszinkron lambda kifejezést, amely egy feladatot visszaadó delegálttá van alakítva, nem tud értéket visszaadni.
- CS8204: A típus AsyncMethodBuilderként való használatához a Tevékenység tulajdonságnak a deklarált típus helyett a szükséges típust kell visszaadnia.
Az alábbi elemek bemutatják, hogyan lehet kijavítani az egyes hibákat. Az aszinkron metódus deklarációiról további információt a módosító és az asyncAsync visszatérési típusaiban talál.
- Módosítsa a visszatérési kifejezést úgy, hogy megfeleljen az aszinkron metódus mögöttes eredménytípusának (CS1983, CS4016). Az aszinkron metódus visszaadásakor
Task<T>, azreturnutasításnak egyTtípusú értéket kell szolgáltatnia, nemTask<T>értéket, mert a fordító által létrehozott állapotgép automatikusan becsomagolja az értéket egy feladatba. A CS1983 akkor jelenik meg, amikor a metódus visszatérTask<T>, és a kifejezés ;TA CS4016 azt az általános esetet ismerteti, amikor a visszatérési kifejezés típusa nem egyezik meg. - Távolítsa el a módosítót olyan
asyncmetódusokból, amelyek nem rendelkeznek törzstel, például absztrakt metódusok vagy interfészmetódus-deklarációk (CS1994). Aasyncmódosítóhoz egy metódustörzsre van szükség, hogy a fordító létrehozhassa az állapotgép-implementációt. - Az aszinkron belépési pont visszatérési típusának módosítása Task vagy Task<TResult> (CS4009). A C# 7.1-től kezdve a
Mainmetódus lehetasync, de visszatérési értéke kell legyenTaskvagyTask<int>-async void, mert azasync intérvénytelen belépési pont aláírások. - Egy belépési pont eltávolítása vagy átnevezése, ha a projekt szinkron és aszinkron
Mainmetódust (CS8892) is tartalmaz. A fordító kiválasztja a szinkron belépési pontot, és figyelmeztetést ad ki az figyelmen kívül hagyott aszinkron jelöltet illetően. - Adjon hozzá explicit visszatérési típust a lambda kifejezéshez az
[AsyncMethodBuilder]attribútum (CS8935) alkalmazása előtt. A fordító nem tudja feloldani egy névtelen metódus szerkesztőtípusát, amelynek visszatérési típusa kikövetkeztetett, mert az attribútumnak egy adott visszatérési típussal kell egyeznie a fordításkor. - Módosítsa az
[AsyncMethodBuilder]attribútumban megadott típust egy generikus, egy paraméterű kötetlen típusra, példáulMyTaskMethodBuilder<>, ahelyett hogyMyTaskMethodBuilder<T>vagy nem generikus típust használna (CS8940). Ha van ilyen, az építő tároló típusának is nem általánosnak kell lennie. A fordítónak szüksége van erre az alakzatra, hogy bármilyen konkrét feladathoz hasonló visszatérési típushoz összeállíthassa a szerkesztőt. - Cserélje le a manuális
[MethodImpl(MethodImplOptions.Async)]attribútumot aasyncmetódus deklarációján szereplő kulcsszóra (CS9330). AMethodImplOptions.Asyncjelölő belső futtatókörnyezeti használatra van fenntartva, és nem alkalmazható közvetlenül a felhasználói kódban. - Adja hozzá a
asyncmódosítót az iterátorblokkokat tartalmazó metódushoz, és adja vissza IAsyncEnumerable<T> vagy IAsyncEnumerator<T> (CS8403). Aasyncmódosító nélkül a fordító szinkron iterátorként kezeli a metódust, és nem tudja létrehozni az aszinkron streamállapot-gépet. - Távolítsa el a mutató típusú paramétereket az aszinkron metódusokból (CS4005). Az egérmutatók olyan rögzített memóriahelyeket mutatnak, amelyek nem őrizhetők meg biztonságosan az aszinkron felfüggesztési pontokon, ahol a végrehajtás egy másik szálon folytatódhat.
- Eltávolítás
__arglistaz aszinkron metódusparaméter-listákból (CS4006). A változó hosszúságú argumentumlisták olyan veremalapú hívási konvencióktól függnek, amelyek nem kompatibilisek a halom által lefoglalt aszinkron állapotgéppel. - Távolítsa el az aszinkron metódusokból, illetve az aszinkron lambdakifejezésekből a
ref,invagyoutparamétereket, valamint aref structtípusú, például Span<T> vagy ReadOnlySpan<T> paramétereket (CS4012). Ezek a paramétertípusok veremhez kötöttek, és nem rögzíthetők biztonságosan a halomban lefoglalt aszinkron állapotgép lezárásában. - Módosítsa a céldelegált típusát úgy, hogy megfeleljen az aszinkron lambda visszatérési típusának (CS4010). Az aszinkron lambda visszaadhat
void, Taskvagy Task<TResult>, és a fordító nem tudja átalakítani ezeket tetszőleges delegált típusokká, amelyek eltérő visszatérési típusokat várnak. - Távolítsa el a
returnkifejezést egy olyan aszinkron lambdából, amely nem általánosTaskvisszaadott delegálthoz van rendelve, vagy módosítsa a delegálás típusát úgy, hogyFunc<Task<T>>a lambda visszaadhassa az értéket (CS8031). A nem generikusTask-t visszaadó delegált egy eredmény nélküli aszinkron műveletet reprezentál, ezért az érték visszaadása típuskompatibilitási problémát okoz. - Távolítsa el az attribútumot az aszinkron
[MethodImpl(MethodImplOptions.Synchronized)]metódusokból (CS4015). ASynchronizedbeállítás zárolást szerez a metódus egész végrehajtásához, de egy aszinkron metódus felfüggesztésre kerül és folytatódik potenciálisan eltérő szálakon, ami a zárolás szemantikáját meghatározatlanná teszi. - Javítsa ki az egyéni
AsyncMethodBuildertípust, hogy aTasktulajdonsága ugyanazt a típust adja vissza, mint az async metódus deklarált visszatérési típusa (CS8204). A fordító az építőTasktulajdonságát használja a végső feladatobjektum megszerzéséhez, így a típuseltérés megakadályozza, hogy az állapotgép megfelelően működjön.
Aszinkron eljárások
- CS1989: Az aszinkron lambda kifejezések nem konvertálhatók kifejezésfákká.
- CS1991: A "Type" nem tudja implementálni az "eseményt", mert windowsos futtatókörnyezeti esemény, az "esemény" pedig egy normál .NET-esemény.
- CS1997: Mivel a függvény egy aszinkron metódus, amely egy értéket ad vissza, a visszaadott kulcsszót nem szabad objektumkifejezéssel követni.
-
CS1998: Ez az aszinkron metódus nem rendelkezik "
await" operátorokkal, és szinkronban fog futni. Fontolja meg a "await" operátor használatát a nem blokkoló API-hívásokra való várakozáshoz, vagy "await Task.Run(...)" a processzorhoz kötött munka elvégzésére egy háttérszálon. -
CS4014: Mivel ez a hívás nem várható, az aktuális metódus végrehajtása a hívás befejezése előtt folytatódik. Fontolja meg az
awaitoperátor alkalmazását a hívás eredményére. - CS8177: Az aszinkron metódusok nem rendelkeznek hivatkozási helyi adatokkal.
-
CS9123: A "
&" operátor nem használható paramétereken vagy helyi változókon az aszinkron metódusokban. - CS4029: Nem adható vissza "void" típusú kifejezés.
- CS4030: A biztonsági attribútum nem alkalmazható aszinkron metódusra.
- CS4031: Az aszinkron metódusok nem engedélyezettek a SecurityCritical vagy SecuritySafeCritical attribútummal rendelkező interfészben, osztályban vagy struktúrában.
Az alábbi elemek bemutatják, hogyan lehet kijavítani az egyes hibákat. További információért lásd: Az aszinkron programozás az async és await kulcsszavakkal, valamint a await operátort.
- Adja hozzá az
awaitoperátort minden olyan híváshoz, amely Task vagy Task<TResult> visszatér, vagy_ =explicit módon elveti az eredményt, ha a figyelmen kívül hagyás valóban szándékos (CS4014). Azawaithiányában az aszinkron művelet által okozott bármilyen kivétel csendesen elveszik, és a hívó metódus még a művelet befejezése előtt folytatja a végrehajtást, ami finom sorrendi és helyességi hibákat okozhat. - Távolítsa el a
returnkifejezést egy olyan aszinkron metódusból, amelynek visszatérési típusaTask(nem általános), vagy módosítsa a visszatérési típustTask<T>arra az esetre, amikor a metódusnak értéket kell visszaadnia (CS1997). EgyTask-t visszaadó aszinkron metódusban a fordító létrehozza a feladatburkolót – értéket visszaadni típusbeli eltérés, mivel a metódus aláírása nem ígér eredményt. - Adjon hozzá legalább egy
awaitkifejezést a metódus törzséhez, vagy távolítsa el aasyncmódosítót, és adja vissza közvetlenül a feladatot (CS1998). Aasynckifejezések nélküliawaitmetódusok teljes mértékben szinkron módon futnak, ami szükségtelen állapotgép-többletterhelést okoz. Ha a metódus szándékosan körbefuttat egy szinkron műveletet, a feladat eltávolításaasyncés visszaadása explicit módon megszünteti ezt a többletterhelést. - Írja át a lambda kifejezést, hogy ne használja
async, ha egy olyan kifejezésfatípushoz van hozzárendelve, mint aExpression<Func<...>>(CS1989). A kifejezésfák olyan adatstruktúrákként jelölik a kódot, amelyeket a fordító elemezni vagy lefordítani tud, de az előállított összetett állapotgépasyncnem rögzíthető kifejezésfában. - Módosítsa az esemény implementációját, hogy a felület deklarációja és a implementálási osztály is megegyezhessen abban, hogy az esemény windowsos futtatókörnyezeti szemantikát vagy normál .NET-szemantikát (CS1991) használ-e. Ez a hiba olyan Windows-futtatókörnyezeti interop forgatókönyvekre vonatkozik, ahol a WinRT-esemény nem implementálható normál .NET-eseményként, vagy fordítva.
- Távolítsa el az operátor (
&) címét az aszinkron metódusokon (CS9123) belül paraméterekre vagy helyi változókra hivatkozó kifejezésekből. Az aszinkron állapotú gép a felfüggesztés során áthelyezheti a rögzített változókat a halomba, ami érvénytelenné tenné a cím alapján kapott mutatót. - Távolítsa el a helyi változókat az aszinkron metódusokból, vagy győződjön meg arról, hogy nem terjednek át egy
awaithatáron (CS8177). Az állapotgép aszinkron módban rögzíti a helyi változókat a heapben foglalt lezárásokban, és a veremhelyekre mutató hivatkozások nem őrizhetők meg biztonságosan a felfüggesztési pontok között. A C# 13-as és újabb verzióiban a lokális változók engedélyezettek az aszinkron metódusokban, amíg nem lépik át egyrefhatáron, és ez a hiba nem keletkezik. - Távolítsa el azt az utasítást, amely a
returnmetódus eredményét adja vissza, vagy módosítsa a hívott metódust úgy, hogy az egy értéket (void) adjon vissza. Nem használhatóreturn SomeVoidMethod();, mertvoidnem értékként visszaadható típus. Távolítsa el a kulcsszótreturn, és hívja meg a metódust önálló utasításként, vagy módosítsa a metódus aláírását egy konkrét típus visszaadásához. - Távolítsa el az aszinkron metódusokhoz (
[SecurityCritical]) hasonló[SecuritySafeCritical]biztonsági attribútumokat, vagy távolítsa el a módosítót azasyncezen attribútumokkal megjelölt típusok metódusaiból (CS4031). A kódhozzáférés biztonsági megjegyzései a deklarálási módszerre vonatkoznak, de a fordító által létrehozott aszinkron állapotú gép egy külön környezetben fut, ahol ezek a biztonsági megjegyzések nem kényszeríthetők ki.