Hibák és figyelmeztetések elhárítása a mintaegyező kifejezésekben

Ez a cikk a következő fordítóhibákat és figyelmeztetéseket ismerteti:

  • CS8116: A mintában nem lehet null értékű típust használni, helyette az alapul szolgáló típust kell használni.
  • CS8117: Érvénytelen operátor a mintaegyezéshez: értéket várunk, de kifejezést találtunk.
  • CS8119: A kapcsolókifejezésnek értéknek kell lennie; talált kifejezésnek kell lennie.
  • CS8120: A kapcsolós eset nem érhető el. Egy korábbi eset már kezelte, vagy lehetetlen megegyezni.
  • CS8121: A forrástípus kifejezését nem lehet céltípus-mintával kezelni.
  • CS8208: Nem legális a "dinamikus" típus használata egy mintában.
  • CS8502: A típuskénti megfeleltetéshez megfelelő alpatterek szükségesek, de helytelen alpatterek vannak jelen.
  • CS8503: A tulajdonság allapja megköveteli a megfeleltetendő tulajdonságra vagy mezőre mutató hivatkozást, például: "{{ Név: érték }}"
  • CS8504: Hiányzik a minta
  • CS8505: Az alapértelmezett literál 'default' nem érvényes mintázatként. Szükség szerint használjon más literált (például '0' vagy 'null'). Ha mindent egyezni szeretne, használjon elvetési mintát (_).
  • CS8506: A kapcsolókifejezéshez nem található a legjobb típus.
  • CS8508: A minta "var" szintaxisa nem hivatkozhat típusra, de var a típus itt a hatókörben van.
  • CS8509: A kapcsolókifejezés nem kezeli a bemeneti típus összes lehetséges értékét (nem teljes). Például a "..." minta nincs lefedve.
  • CS8510: A minta elérhetetlen. Már kezelve lett a kapcsolókifejezés egy korábbi ágában, vagy nincs lehetőség egyeztetésre.
  • CS8512: A "_" név az állandóra utal, nem az elvetési mintára. A "var _" használatával elvetheti az értéket, a @_pedig egy állandóra hivatkozhat az adott név alapján.
  • CS8513: A "_" név a típusra _utal, nem az elvetési mintára. A típushoz használja a "@_" vagy a "var _" karaktert az elvetéshez.
  • CS8515: Zárójelek szükségesek a kapcsolót szabályozó kifejezés körül.
  • CS8516: A név nem azonosítja a "{1}" tömb-elemet.
  • CS8517: A név nem egyezik a megfelelő "Deconstruct" paramétersel.
  • CS8518: Az ilyen típusú kifejezések soha nem egyeznek a megadott mintával.
  • CS8519: A megadott kifejezés soha nem egyezik a megadott mintával.
  • CS8520: A megadott kifejezés mindig megegyezik a megadott állandóval.
  • CS8521: A mintaegyeztetés nem engedélyezett a mutatótípusok esetében.
  • CS8522: Az elemnevek nem engedélyezettek a "System.Runtime.CompilerServices.ITuple" használatával történő mintaegyeztetés során.
  • CS8523: Az elvetési minta nem engedélyezett esetcímkeként a kapcsolóutasításban. Használja a "case var _:" karaktert egy elvetési mintához, vagy a "case @_:" karaktert egy "_" nevű állandóhoz.
  • CS8524: A kapcsolókifejezés nem kezeli a bemeneti típus egyes értékeit (ez nem teljes), és nem tartalmaz névtelen számértéket.
  • CS8525: A változó kijelölőnek tulajdonságminta után kell következnie.
  • CS8780: Egy változó nem deklarálható "nem" vagy "vagy" mintán belül.
  • CS8781: Relációs minták nem használhatók ilyen típusú értékekhez.
  • CS8782: Relációs minták nem használhatók lebegőpontos naN-hoz.
  • CS8793: A megadott kifejezés mindig megegyezik a megadott mintával.
  • CS8794: A "{0}" típusú kifejezés mindig megfelel a megadott mintának.
  • CS8846: A kapcsolókifejezés nem kezeli a bemeneti típus összes lehetséges értékét (nem teljes). Ezt a mintát például nem fedi le a rendszer. A "mikor" záradékkal rendelkező minta azonban sikeresen megfelelhet ennek az értéknek.
  • CS8918: Azonosító vagy egyszerű taghozzáférés várható.
  • CS8978: '...' nem tehető null értékűvé.
  • CS8979: A listaminták nem használhatók "..." típusú értékekhez.
  • CS8980: A szeletminták csak egyszer és közvetlenül egy listamintán belül használhatók.
  • CS8985: Listaminták nem használhatók "..." típusú értékekhez. Nem található megfelelő "Length" vagy "Count" tulajdonság.
  • CS9013: A 'null' karakterlánc konstans nem támogatott mintaként a következőhöz: "...". Ehelyett használjon üres karakterláncot.
  • CS9060: Nem használható numerikus állandó vagy relációs minta a következőn: "..." mivel az "INumberBase<T>"-től örökli vagy kiterjeszti. Fontolja meg egy típusminta használatát egy adott numerikus típusra való szűkítéshez.
  • CS9134: A kapcsolókifejezés ága nem 'case' kulcsszóval kezdődik.
  • CS9135: A típus állandó értéke várható
  • CS9336: A minta redundáns.
  • CS9337: A minta túl összetett a redundancia elemzéséhez.
  • CS9344: Az "==" operátor nem támogatott a mintában.
  • CS9345: A '!=' operátor nem támogatott a mintában. Használja a 'nem' kifejezést a tagadott minta ábrázolásához.

Kifejezésszintaxis-hibák váltása

  • CS8119: A kapcsolókifejezésnek értéknek kell lennie; talált kifejezésnek kell lennie.
  • CS8504: Hiányzik a minta
  • CS8505: Az alapértelmezett literál 'default' nem érvényes mintaként. Használjon másik literált (például "0" vagy "null") szükség szerint. Ha mindent egyezni szeretne, használjon egy elvetési mintát '_'.
  • CS8506: A kapcsolókifejezéshez nem található a legjobb típus.
  • CS8515: Zárójelek szükségesek a kapcsolót szabályozó kifejezés körül.
  • CS8523: Az elvetési minta nem engedélyezett esetcímkeként a kapcsolóutasításban. Használja a "case var _:" karaktert egy elvetési mintához, vagy a "case @_:" karaktert egy "_" nevű állandóhoz.
  • CS9134: Egy kapcsolókifejezés ág nem "case" kulcsszóval kezdődik.
  • CS9135: A típus állandó értéke várható
  • CS9344: Az "==" operátor nem támogatott a mintában.
  • CS9345: A '!=' operátor nem használható mintában. Használja a „nem” a tagadott minták ábrázolására.

Adjon meg egy értéket egy utasítás vagy kifejezés irányító kifejezéseként switch (CS8119). A szabályozási kifejezésnek értéket kell létrehoznia. A típusok, a névterek, a metóduscsoportok és voida -returning metódusok érvénytelenek. Olyan kifejezést használjon, amely kiértékel egy értéket.

Adja meg a várt mintát (CS8504). A kapcsolókar vagy is kifejezés mintát igényel a megfelelő szintaxis után. Győződjön meg arról, hogy érvényes mintakifejezést tartalmaz.

Ne használja a default literálist mintaként (CS8505). A default kulcsszó nem érvényes a mintaegyezésben. Használjon egy adott literálértéket, például 0 vagy null helyette, vagy használja az elvetési mintát _ bármely értékhez.

Adjon meg egy explicit típust a kapcsolókifejezés eredményének, ha a fordító nem tudja megállapítani a legjobb típust az ágakból (CS8506). Ez a hiba akkor fordul elő, ha a kifejezések olyan különböző típusú értékeket adnak vissza, amelyekre a fordító nem tud automatikusan közös típust levezetni, mint például metóduscsoportok vagy lambdák esetén. Rendelje hozzá az eredményt egy explicit módon típusú változóhoz ahelyett, hogy a var-t használná.

Tegye a switch utasítás szabályozó kifejezését zárójelek közé, a törzset pedig kapcsos zárójelek közé (CS8515). Az switch utasításhoz zárójelek szükségesek a kiértékelendő kifejezés körül, és kapcsos zárójelek a test körül. Ez a hiba akkor fordul elő, ha a zárójelek vagy a kapcsos zárójelek hiányoznak.

Használja a case var _:-t a csupasz elvetés _ helyett egy switch utasítás eseti címkéjeként (CS8523). A csupasz eldobási minta nem engedélyezett a switch utasításokban, mert a névvel ellátott _ állandóval való kétértelműség miatt. Elvetéshez case var _: használható, vagy case @_: egy elnevezett _ állandóval való egyezéshez.

Távolítsa el a case kulcsszót a switch kifejezés ágairól. A kapcsolókifejezések más szintaxist használnak, mint a kapcsoló utasítások (CS9134). A kapcsolókifejezésekben minden kar egy mintából, egy => elválasztóból és egy kifejezésből áll, case kulcsszó nélkül, amit a kapcsoló utasításoknál használnak. A minták változói helyett használjon állandó értékeket. A mintaegyeztetéshez fordítási időállandókra (CS9135) van szükség. A változók nem használhatók mintaként. A fordítónak ismernie kell a pontos értékeket fordításkor a megfelelő megfelelő kód létrehozásához.

Használjon relációs minta operátorokat (<, >, <=, >=) vagy a not kulcsszót ahelyett, hogy a == és != operátorokat használná a mintákban (CS9344, CS9345). Az egyenlőségi és egyenlőtlenségi operátorok nem támogatottak a mintaszintaxisban. Használjon állandó mintát az egyenlőséghez, és az egyenlőtlenséghez not kulcsszót.

A helyes szintaxisról további információt a Kifejezésváltás című témakörben talál.

Minta teljessége és redundancia

  • CS8120: A kapcsolós eset nem érhető el. Egy korábbi eset már kezelte, vagy lehetetlen megegyezni.
  • CS8509: A kapcsolókifejezés nem kezeli a bemeneti típus összes lehetséges értékét (nem teljes). Például a "..." minta nincs lefedve.
  • CS8510: A minta nem érhető el. Ezt már kezelte a kapcsolókifejezés egy korábbi ága, vagy lehetetlen egyezni vele.
  • CS8518: Egy típuskifejezés soha nem egyezhet meg a megadott mintával.
  • CS8519: A megadott kifejezés soha nem egyezik a megadott mintával.
  • CS8520: A megadott kifejezés mindig megegyezik a megadott állandóval.
  • CS8524: A kapcsolókifejezés nem kezeli a bemeneti típus egyes értékeit (ez nem teljes), és nem tartalmaz névtelen számértéket. A feljegyzett minta például nincs lefedve.
  • CS8793: A megadott kifejezés mindig megegyezik a megadott mintával.
  • CS8794: A típuskifejezések mindig megegyeznek a megadott mintával.
  • CS8846: A kapcsolókifejezés nem kezeli a bemeneti típus összes lehetséges értékét (nem teljes). A feljegyzett minta például nincs lefedve. A "mikor" záradékkal rendelkező minta azonban sikeresen megfelelhet ennek az értéknek.
  • CS9336: A minta redundáns.
  • CS9337: A minta túl összetett a redundancia elemzéséhez.

A nem elérhető esetcímkék átrendezhetők vagy eltávolíthatók a utasításokban switch (CS8120). A case címke nem érhető el, ha egy korábbi eset már kezeli az összes olyan értéket, amelyekkel a későbbi esetek foglalkoznának. Ez akkor fordul elő, ha egy általánosabb minta egy konkrétabb előtt jelenik meg, vagy ha a minta nem felel meg a bemeneti típusnak.

Adjon hozzá kapcsolókarokat, amelyek az összes lehetséges bemeneti értéket kezelik a teljes körű kapcsolókifejezések létrehozásához (CS8509, CS8524, CS8846). A kapcsolókifejezéseknek a bemeneti típus minden lehetséges értékére ki kell terjedniük. Ellenkező esetben a fordító nem tudja garantálni, hogy a kifejezés eredményt ad az összes bemenethez. A fordító külön figyelmeztet a meg nem nevezett számértékekre (CS8524), valamint azokra az esetekre, amikor egy when záradék megfelelhet egy egyébként nem kezelt értéknek (CS8846). Használja az elvetési mintát (_) végső megoldásként, hogy lefedje az összes fennmaradó értéket, amelyet nem kell kifejezetten kezelnie.

Átrendezheti vagy eltávolíthatja a nem elérhető switch kifejezési ágakat (CS8510). A CS8120 utasításhoz hasonlóan, ez a hiba azt jelzi, hogy egy váltakozókifejezési ág nem érhető el, mert egy korábbi ág már kezeli az összes olyan értéket, amelyet a későbbi ág is kezelne.

Tekintse át azokat a mintákat, amelyek soha nem egyeznek vagy mindig egyeznek a bemenettel (CS8518, CS8519, CS8520, CS8793, CS8794). Ezek a diagnosztikák azt jelzik, hogy a fordító a fordításkor meg tudja állapítani, hogy egy minta mindig vagy soha nem egyezik-e. A mindig egyező minta redundáns, a soha nem egyező minta pedig halott kód. Mindkettő logikai hibákat jelezhet.

Tekintse át azokat a mintákat, amelyeket a fordító redundánsként azonosít. A redundáns minták olyan logikai hibát jelezhetnek, ahol Ön not használatára gondolt, vagy különböző logikai operátorokat (CS9336). Egyszerűsítse le az összetett mintákat, amelyek túl bonyolultak ahhoz, hogy a fordító elemezze a redundanciát. Bontsa őket egyszerűbb, karbantarthatóbb kifejezésekre (CS9337).

A teljességi követelményekről és a mintaoptimalizálásról további információt a Kifejezés váltása, a Kapcsoló utasítás és a Minták című témakörben talál.

Típus sablon hibái

  • CS8116: A mintában nem lehet null értékű típust használni, helyette az alapul szolgáló típust kell használni.
  • CS8117: Érvénytelen operandus a mintaegyezéshez; érték megadása kötelező, de kifejezés található.
  • CS8121: A forrástípus kifejezését nem lehet céltípus-mintával kezelni.
  • CS8208: Nem legális a "dinamikus" típus használata egy mintában.
  • CS8508: A minta "var" szintaxisa nem hivatkozhat típusra, de var a típus itt a hatókörben van.
  • CS8513: A "_" név a típusra _utal, nem az elvetési mintára. A típushoz használja a "@_" vagy a "var _" karaktert az elvetéshez.
  • CS8521: A mintaegyeztetés nem engedélyezett a mutatótípusok esetében.
  • CS8781: Relációs minták nem használhatók típusértékekhez.
  • CS8782: Relációs minták nem használhatók lebegőpontos naN-hoz.
  • CS8978: '...' nem tehető null értékűvé.
  • CS9060: Nem használható numerikus állandó vagy relációs minta a következőn: "..." mivel az "INumberBase<T>"-től örökli vagy kiterjeszti. Fontolja meg egy típusminta használatát egy adott numerikus típusra való szűkítéshez.

Használja a mögöttes típust null értéket is tartalmazó típus helyett a mintákban (CS8116). Nem használhat közvetlenül olyan null értékű értéktípust, mint a int? egy típusmintában. Ehelyett használja az alapul szolgáló típust (int), és a minta megegyezik a null értékű és a nem null értékű értékekkel is.

Adjon meg egy értéket operandusként egy mintaegyezéshez (CS8117). A kifejezés bal oldalán is értéknek kell lennie, nem típusnak, névtérnek vagy metóduscsoportnak. Először rendelje hozzá az eredményt egy változóhoz, vagy használjon egy másik kifejezést, amely értéket állít elő.

Használjon olyan mintatípust, amely kompatibilis a kifejezéstípussal (CS8121). A fordító ezt a hibát akkor észleli, ha a kifejezés típusa és a minta típusa között nincs lehetséges átalakítás. Például nem egyeztethet egy string kifejezést egy int típusmintával. Módosítsa a minta típusát a kifejezéssel kompatibilisre, vagy állítsa a kifejezést egy kompatibilis típusra.

Ne használjon dynamic típusként egy mintában (CS8208). A dynamic típus nem támogatott a mintaegyezésben. Használja inkább a object-t, vagy alakítsa át az értéket egy adott típusra az egyeztetés előtt.

Nevezze át a típust var , vagy használjon explicit típust a mintában (CS8508). Ha egy elnevezett var típus hatókörben van, a var minta szintaxisa nem egyértelmű. A fordító nem tudja meghatározni, hogy használni kívánja-e a var mintát, vagy hivatkozik-e a típusra. Használja a teljes típusnevet, vagy nevezze át a típust az ütközés elkerülése érdekében.

Használja a @_ az egy _ nevű típusra való hivatkozáshoz, vagy használja a var _ az elvetési mintához (CS8513). Ha egy _ típus van hatókörben, a fordító nem tudja megállapítani, hogy a _ a típust vagy az elvetési mintát jelenti-e.

Ne használjon mutatótípusokkal (CS8521) egyező mintát. A mutatótípusok nem támogatottak a mintamegfeleltetési kifejezésekben. Használjon inkább explicit összehasonlításokat vagy kényszerítéseket.

Támogatott típus használata relációs mintákkal (CS8781, CS8782). A relációs minták (<, >, , <=>=) csak az összehasonlítást támogató numerikus típusokkal működnek. NaN-értékekkel nem használhatók, mert a NaN-összehasonlítások eredménye mindig false.

A mögöttes típust közvetlenül a mintákban használhatja, ha olyan típusokkal dolgozik, amelyek nem tehetők null értékűvé (CS8978). Az olyan típusok, mint a System.Nullable<T>mutatótípusok és a refstruktúratípusok nem tehetők null értékűvé. A mintamegfeleltetési logikában az alaptípust kell használnia.

Típusmintákkal szűkítheti az általános numerikus típusokat adott numerikus típusokra, mielőtt numerikus állandókat vagy relációs mintákat (CS9060) alkalmaz. Nem egyezhet meg a közvetlenül numerikus állandókkal vagy relációs mintákkal implementálható INumberBase<T> általános numerikus típusokkal. A fordító nem tudja meghatározni, hogy melyik numerikus típust próbálja megfeleltetni. Először egy konkrét numerikus típusra kell szűkítenie az értéket, például int: , doublevagy decimal.

A típusmintákról további információt a Null értékű értéktípusok, minták és általános matematikai adatok című témakörben talál.

Listaminta hibái

  • CS8979: A listaminták nem használhatók "..." típusú értékekhez.
  • CS8980: A szeletmintákat csak egyszer és közvetlenül egy listamintában lehet használni.
  • CS8985: Listaminták nem használhatók "..." típusú értékekhez. Nem található megfelelő "Length" vagy "Count" tulajdonság.
  • CS9013: Bármilyen 'null' string használata mintaként nem támogatott '...'-hoz. Ehelyett használjon üres stringet.

Győződjön meg arról, hogy a típus támogatja a listamintákhoz szükséges műveleteket. A listamintákhoz megszámlálható és indexelhető típusok szükségesek (CS8979, CS8985). A típusnak elérhető Length vagy Count tulajdonságúnak kell lennie, és támogatnia kell az indexelést. A listamintákat támogató futtatókörnyezettípusok közé tartoznak a tömbök, List<T>Span<T>és a megfelelő tagokkal rendelkező egyéb gyűjteménytípusok.

A szeletmintákat (..) közvetlenül egy listamintába helyezheti. Listamintánként csak egyszer használja őket, mert nem jelennek meg beágyazott mintákban vagy listamintákon kívül (CS8980).

Amikor Span<char> vagy ReadOnlySpan<char> típusokat feleltetsz meg, használj üres karakterláncot "" a karakterlánc null állandója helyett. A literál null nem támogatott mintaként a span típusok (CS9013) esetében.

A listaminta követelményeiről és szintaxisáról további információt a Listaminták és minták című témakörben talál.

Részmintázati hibák

  • CS8502: A tuple típusnak való megfeleléshez al-mintákra van szükség, de helytelen al-minták vannak jelen.
  • CS8503: A tulajdonság allapja megköveteli a megfeleltetendő tulajdonságra vagy mezőre mutató hivatkozást, például: "{{ Név: érték }}"
  • CS8512: A "_" név az állandóra utal, nem az elvetési mintára. A "var _" használatával elvetheti az értéket, a @_pedig egy állandóra hivatkozhat az adott név alapján.
  • CS8516: A név nem azonosítja a tömbelemet.
  • CS8517: A név nem egyezik a megfelelő "Deconstruct" paramétersel.
  • CS8522: Az elemnevek nem engedélyezettek a "System.Runtime.CompilerServices.ITuple" használatával történő mintaegyeztetés során.
  • CS8525: Egy változó kijelölőnek egy tulajdonságminta után kell következnie.
  • CS8780: Egy változó nem deklarálható "nem" vagy "vagy" mintán belül.
  • CS8918: Azonosító vagy egyszerű taghozzáférés várható.

Adja meg a megfelelő számú alapmintát a CS8502 típusnak megfelelően. A pozíciómintában lévő alpatterek számának meg kell egyeznie a tuple típusú elemek számával. Almintaelemeket adhat hozzá vagy távolíthat el, hogy a tupel aritásának megfeleljenek.

Adja meg a tulajdonságot vagy a mező nevét a tulajdonság allapjaiban (CS8503). Minden tulajdonsági részmintázatnak meg kell adnia, hogy melyik tulajdonságot vagy mezőt illesszen. A szintaxis { PropertyName: pattern } használatával azonosíthatja a tagot.

Az elvetési mintához vagy var _ egy elnevezett @_ állandóhoz (_) használható. Ha egy _ nevű konstans van hatókörben, akkor a case címkében önmagában lévő _ az állandóra hivatkozik. Az elvetési minta használatához írjon var _ helyette.

Használja a helyes elemneveket a csuplok (CS8516) és a dekonstruált típusok (CS8517) pozíciói mintáiban. Ha megnevez alpattereket egy pozíciómintában, a neveknek meg kell egyezniük a cseuple elem neveivel vagy a Deconstruct metódus paraméterek neveivel.

Az elemek nevét ne használja a pozíciómintákban, amikor a ITuple (CS8522) révén egyeztet. Ha egy típus az ITuple interfészen keresztül, nem pedig egy Deconstruct metóduson keresztül van egyeztetve, akkor nincsenek elnevezett elemek. Távolítsa el az elemneveket a mintából.

Helyezze a változó jelölőt a tulajdonságminta mögé, ne előtte (CS8525). Változómegjelölésű tulajdonságmintában a változó nevének a minta záró zárójelét kell követnie. Például írjon { Length: > 0 } s ahelyett, hogy s { Length: > 0 }.

Nem deklarálhat változókat a not vagy or mintás kombinátorokban (CS8780). A minták változódeklarációi not nem feltétlenül vannak hozzárendelve, és a minták változói or csak egy ágban vannak hozzárendelve. Helyezze át a változó deklarációt a minta-kombinátoron kívülre.

Használjon egy azonosítót vagy egy egyszerű taghozzáférési kifejezést tulajdonságnévként a tulajdonságmintákban és a pozícióbeli alpatterekben (CS8918). Az összetett kifejezések, metódushívások vagy más nem egyszerű taghozzáférések nem megengedettek egy tulajdonságalminta bal oldalán. Minden altartománynévnek közvetlen tulajdonságnak vagy mezőnévnek vagy pontozott tagelérési útvonalnak kell lennie, például Property.SubProperty.

Az alhálózati szintaxisról további információt a Tulajdonságminta és a Pozícióminta című témakörben talál.