Fouten en waarschuwingen in patroonkoppelingsexpressies oplossen

In dit artikel worden de volgende compilerfouten en -waarschuwingen behandeld:

  • CS8116: Het is niet legaal om nullable type in een patroon te gebruiken. Gebruik in plaats daarvan het onderliggende type.
  • CS8117: Ongeldig operand voor patroonherkenning; waarde vereist, maar uitdrukking gevonden.
  • CS8119: De switchexpressie moet een waarde zijn; gevonden expressie.
  • CS8120: De switch case is onbereikbaar. Het is al afgehandeld door een eerdere case of het is onmogelijk om overeen te stemmen.
  • CS8121: Een expressie van het brontype kan niet worden verwerkt door een patroon van het doeltype.
  • CS8208: Het is niet legaal om het type 'dynamisch' in een patroon te gebruiken.
  • CS8502: Voor het overeenkomende tupletype zijn genoteerde subpatronen vereist, maar er zijn onjuiste subpatronen aanwezig.
  • CS8503: Voor een subpatroon van een eigenschap moet worden verwezen naar de eigenschap of het veld, bijvoorbeeld {{ Naam: waarde }}.
  • CS8504: Patroon ontbreekt
  • CS8505: Een standaard letterlijke 'standaardwaarde' is niet geldig als patroon. Gebruik desgewenst een andere letterlijke waarde (bijvoorbeeld '0' of 'null'). Als u alles wilt vergelijken, gebruikt u een verwijderingspatroon '_'.
  • CS8506: Er is geen beste type gevonden voor de switchexpressie.
  • CS8508: De syntaxis 'var' voor een patroon is niet toegestaan om naar een type te verwijzen, maar var het type is hier binnen het bereik.
  • CS8509: De switchexpressie verwerkt niet alle mogelijke waarden van het invoertype (dit is niet volledig). Bijvoorbeeld het patroon '...' is niet gedekt.
  • CS8510: Het patroon is onbereikbaar. Het is al verwerkt door een vorige arm van de switchexpressie of het is onmogelijk om overeen te komen.
  • CS8512: De naam '_' verwijst naar de constante, niet naar het verwijderingspatroon. Gebruik var _om de waarde te negeren of @_om naar een constante met die naam te verwijzen.
  • CS8513: De naam '_' verwijst naar het type _, niet naar het patroon verwijderen. Gebruik @_voor het type of var _om te verwijderen.
  • CS8515: Haakjes zijn vereist rond de besturende expressie van de switch.
  • CS8516: De naam identificeert geen tuple-element '{1}'.
  • CS8517: De naam komt niet overeen met de bijbehorende parameter Deconstruct.
  • CS8518: Een expressie van dit type kan nooit overeenkomen met het opgegeven patroon.
  • CS8519: De opgegeven expressie komt nooit overeen met het opgegeven patroon.
  • CS8520: De opgegeven expressie komt altijd overeen met de opgegeven constante.
  • CS8521: Patroonkoppeling is niet toegestaan voor aanwijzertypen.
  • CS8522: Elementnamen zijn niet toegestaan wanneer patroonkoppeling via System.Runtime.CompilerServices.ITuple wordt gebruikt.
  • CS8523: Het verwijderingspatroon is niet toegestaan als een caselabel in een switch-instructie. Gebruik 'case var _:' voor een verwijderingspatroon of 'case @_:' voor een constante met de naam _.
  • CS8524: De switchexpressie verwerkt sommige waarden van het invoertype niet (het is niet uitputtend) betreffende een niet-benoemde enumwaarde.
  • CS8525: Een variabele aanwijzer moet na een eigenschapspatroon komen.
  • CS8780: Een variabele kan niet worden gedeclareerd binnen een 'not' of 'or'-patroon.
  • CS8781: Relationele patronen kunnen niet worden gebruikt voor een waarde van dit type.
  • CS8782: Relationele patronen kunnen niet worden gebruikt voor een drijvendekomma-NaN.
  • CS8793: De opgegeven expressie komt altijd overeen met het opgegeven patroon.
  • CS8794: Een expressie van het type '{0}' komt altijd overeen met het opgegeven patroon.
  • CS8846: De switchexpressie verwerkt niet alle mogelijke waarden van het invoertype (dit is niet volledig). Dit patroon wordt bijvoorbeeld niet behandeld. Een patroon met een 'when'-component kan echter overeenkomen met deze waarde.
  • CS8918: Id of een eenvoudige toegang tot leden verwacht.
  • CS8978: '...' kan niet null worden gemaakt.
  • CS8979: Lijstpatronen kunnen niet worden gebruikt voor een waarde van het type ....
  • CS8980: Segmentpatronen kunnen slechts eenmaal en rechtstreeks in een lijstpatroon worden gebruikt.
  • CS8985: Lijstpatronen kunnen niet worden gebruikt voor een waarde van het type .... Er is geen geschikte eigenschap 'Length' of 'Count' gevonden.
  • CS9013: Een tekenreeks 'null' constante wordt niet ondersteund als patroon voor .... Gebruik in plaats daarvan een lege tekenreeks.
  • CS9060: Kan geen numerieke constante of relationeel patroon gebruiken op ...' omdat het 'INumberBase<T>' overgaat of uitbreidt. U kunt een typepatroon gebruiken om te beperken tot een specifiek numeriek type.
  • CS9134: Een schakelexpressiearm begint niet met een 'case'-trefwoord.
  • CS9135: Er wordt een constante waarde van het type verwacht
  • CS9336: Het patroon is redundant.
  • CS9337: Het patroon is te complex om te analyseren op redundantie.
  • CS9344: De operator '==' wordt niet ondersteund in een patroon.
  • CS9345: De operator '!=' wordt niet ondersteund in een patroon. Gebruik 'not' om een negatief patroon weer te geven.

Syntaxisfouten in switch-expressies

  • CS8119: De switchexpressie moet een waarde zijn; gevonden expressie.
  • CS8504: Patroon ontbreekt
  • CS8505: Een standaard letterlijke 'default' is niet geldig als patroon. Gebruik desgewenst een andere letterlijke waarde (bijvoorbeeld '0' of 'null'). Om alles te matchen, gebruik een wildcard patroon '_'.
  • CS8506: Er is geen beste type gevonden voor de switchexpressie.
  • CS8515: Haakjes zijn vereist rond de besturingsuitdrukking van de switch.
  • CS8523: Het verwijderingspatroon is niet toegestaan als een caselabel in een switch-instructie. Gebruik 'case var _:' voor een verwijderingspatroon of 'case @_:' voor een constante met de naam _.
  • CS9134: Een schakelexpressiearm begint niet met een 'case'-trefwoord.
  • CS9135: Er wordt een constante waarde van het type verwacht
  • CS9344: De operator '==' wordt niet ondersteund in een patroon.
  • CS9345: De operator '!=' wordt niet ondersteund in een patroon. Gebruik 'not' om een negatief patroon weer te geven.

Geef een waarde op als de beheerexpressie van een switch instructie of expressie (CS8119). De expressie van het beheer moet een waarde produceren. Typen, naamruimten, methodegroepen en voidretourmethoden zijn niet geldig. Gebruik een expressie die resulteert in een waarde.

Geef een patroon op waarbij er een wordt verwacht (CS8504). Voor een switcharm of is uitdrukking is een patroon vereist na de correcte syntaxis. Zorg ervoor dat u een geldige patroonexpressie opneemt.

Gebruik de default letterlijke tekst niet als patroon (CS8505). Het default trefwoord is niet geldig in patroonkoppeling. Gebruik een specifieke letterlijke waarde, zoals 0 of null in plaats daarvan, of gebruik het verwijderingspatroon _ om een willekeurige waarde te vinden.

Geef een expliciet type op voor het resultaat van de switchexpressie wanneer de compiler het beste type niet kan afleiden uit de armen (CS8506). Deze fout treedt op wanneer de armen waarden retourneren van verschillende typen die geen gemeenschappelijk type delen dat de compiler automatisch kan afleiden, zoals methodegroepen of lambdas. Wijs het resultaat toe aan een expliciet getypte variabele in plaats van te gebruiken var.

Plaats de besturende expressie van een switch uitspraak tussen haakjes en het lichaam tussen accolades (CS8515). De switch instructie vereist haakjes rond de expressie die wordt geëvalueerd en accolades rond de hoofdtekst. Deze fout treedt op wanneer ofwel de haakjes of de accolades ontbreken.

Gebruik case var _: in plaats van de lege discard _ als een case label in een switch instructie (CS8523). Het lege-verwijderingpatroon is niet toegestaan in switch-instructies vanwege dubbelzinnigheid met een constante genaamd _. Gebruiken case var _: voor een verwijdering of case @_: om overeen te komen met een constante met de naam _.

Verwijder het case trefwoord uit schakelexpressiearmen. Schakelexpressies gebruiken een andere syntaxis dan switch-instructies (CS9134). In switchexpressies bestaat elke arm uit een patroon gevolgd door het => token en een expressie, zonder het case trefwoord dat wordt gebruikt in switchinstructies. Gebruik constante waarden in plaats van variabelen in patronen. Voor patroonkoppeling zijn compilatieconstanten (CS9135) vereist. Variabelen kunnen niet als patronen worden gebruikt. De compiler moet de exacte waarden op het moment van compileren kennen om de juiste overeenkomende code te genereren.

Gebruik relationele patroonoperators (<, >, , <=>=) of het not trefwoord in plaats van ==!= operators in patronen (CS9344, CS9345). De operatoren voor gelijkheid en ongelijkheid worden niet ondersteund in de patroonsyntaxis. Gebruik een constant patroon voor gelijkheid en het not trefwoord voor ongelijkheid.

Zie Switch-expressie voor meer informatie over de juiste syntaxis.

Volledigheid en redundantie van patroon

  • CS8120: De switch case is niet toegankelijk. Deze is al verwerkt door een eerdere case, of het is onmogelijk om tot een match te komen.
  • CS8509: De switchexpressie verwerkt niet alle mogelijke waarden van het invoertype (dit is niet volledig). Bijvoorbeeld het patroon '...' is niet gedekt.
  • CS8510: Het patroon is onbereikbaar. Het is al verwerkt door een vorige arm van de switchexpressie of het is onmogelijk om overeen te komen.
  • CS8518: Een expressie van het type kan nooit overeenkomen met het opgegeven patroon.
  • CS8519: De opgegeven expressie komt nooit overeen met het opgegeven patroon.
  • CS8520: De opgegeven expressie komt altijd overeen met de opgegeven constante.
  • CS8524: De switchexpressie verwerkt geen enkele waarden van het invoertype (het is niet volledig) met een niet-benoemde enumwaarde. Het genoteerde patroon wordt bijvoorbeeld niet behandeld.
  • CS8793: De opgegeven expressie komt altijd overeen met het opgegeven patroon.
  • CS8794: Een expressie van het type komt altijd overeen met het opgegeven patroon.
  • CS8846: De switchexpressie verwerkt niet alle mogelijke waarden van het invoertype (dit is niet volledig). Het genoteerde patroon wordt bijvoorbeeld niet behandeld. Een patroon met een 'when'-component kan echter overeenkomen met deze waarde.
  • CS9336: Het patroon is redundant.
  • CS9337: Het patroon is te complex om te analyseren op redundantie.

Onbereikbare caselabels opnieuw ordenen of verwijderen in switch instructies (CS8120). Een case label is onbereikbaar wanneer een vorige case al alle waarden verwerkt die in het latere geval overeenkomen. Dit gebeurt wanneer een meer algemeen patroon wordt weergegeven vóór een specifieker patroon of wanneer het patroon niet overeenkomt met het invoertype.

Schakelarmen toevoegen die alle mogelijke invoerwaarden verwerken om volledige switchexpressies (CS8509, CS8524, CS8846) te maken. Schakelexpressies moeten elke mogelijke waarde van het invoertype dekken. Anders kan de compiler niet garanderen dat de expressie een resultaat produceert voor alle invoer. De compiler waarschuwt afzonderlijk voor niet-benoemde enumwaarden (CS8524) en voor gevallen waarin een when component mogelijk overeenkomt met een anders niet-verwerkte waarde (CS8846). Gebruik het verwijderingspatroon (_) als laatste catch-all-arm om overeen te komen met eventuele resterende waarden die u niet expliciet hoeft te verwerken.

Wijzig de volgorde van of verwijder onbereikbare schakelexpressiearmen (CS8510). Net als CS8120 voor switch instructies geeft deze fout aan dat een schakelexpressiearm onbereikbaar is omdat een vorige arm al alle waarden verwerkt die de latere arm zou overeenkomen.

Bekijk patronen die nooit overeenkomen met of altijd overeenkomen met de invoer (CS8518, CS8519, CS8520, CS8793, CS8794). Deze diagnostische gegevens geven aan dat de compiler tijdens het compileren kan bepalen of een patroon altijd of nooit overeenkomt. Een altijd overeenkomend patroon is redundant en een nooit overeenkomend patroon is dode code. Beide kunnen logische fouten aangeven.

Bekijk patronen die de compiler identificeert als redundant. Redundante patronen kunnen duiden op een logische fout waarbij u not of verschillende logische operatoren (CS9336) had moeten gebruiken. Vereenvoudig complexe patronen die te moeilijk zijn voor de compiler om te analyseren op redundantie. U kunt ze opsplitsen in eenvoudigere, onderhoudbare expressies (CS9337).

Zie Switch-expressie, Switch-instructie en Patronen voor meer informatie over vereisten voor volledigheid en patroonoptimalisatie.

Typepatroonfouten

  • CS8116: Het is niet legaal om nullable type in een patroon te gebruiken. Gebruik in plaats daarvan het onderliggende type.
  • CS8117: Ongeldige operand voor patroonvergelijking; waarde vereist, maar gevonden uitdrukking.
  • CS8121: Een expressie van het brontype kan niet worden verwerkt door een patroon van het doeltype.
  • CS8208: Het is niet legaal om het type 'dynamisch' in een patroon te gebruiken.
  • CS8508: De syntaxis 'var' voor een patroon is niet toegestaan om naar een type te verwijzen, maar var het type is hier binnen het bereik.
  • CS8513: De naam '_' verwijst naar het type _, niet naar het weggooipatroon. Gebruik '@_' voor het type of 'var _' om te verwijderen.
  • CS8521: Patroonkoppeling is niet toegestaan voor aanwijzertypen.
  • CS8781: Relationele patronen kunnen niet worden gebruikt voor een waarde van het type.
  • CS8782: Relationele patronen kunnen niet worden gebruikt voor een zwevendekomma-NaN.
  • CS8978: '...' kan niet null worden gemaakt.
  • CS9060: Kan geen numerieke constante of relationeel patroon gebruiken op ...' omdat het 'INumberBase<T>' overgaat of uitbreidt. U kunt een typepatroon gebruiken om te beperken tot een specifiek numeriek type.

Gebruik het onderliggende type in plaats van het type null in patronen (CS8116). U kunt een waarde type dat null kan zijn, zoals int?, niet direct in een typepatroon gebruiken. Gebruik in plaats daarvan het onderliggende type (int) en het patroon komt overeen met zowel null-waarden als niet-null-waarden.

Geef een waarde op als een operand voor een patroonovereenkomst (CS8117). De linkerkant van een is expressie moet een waarde zijn, niet een type, naamruimte of methodegroep. Wijs het resultaat eerst toe aan een variabele of gebruik een andere expressie die een waarde produceert.

Gebruik een patroontype dat compatibel is met het expressietype (CS8121). De compiler genereert deze fout wanneer er geen conversie mogelijk is tussen het expressietype en het patroontype. U kunt bijvoorbeeld een expressie niet vergelijken string met een int typepatroon. Wijzig het patroontype in een type dat compatibel is met de expressie of cast de expressie naar een compatibel type.

Gebruik niet dynamic als een type in een patroon (CS8208). Het dynamic type wordt niet ondersteund in patroonkoppeling. Gebruik object in plaats daarvan of cast de waarde naar een specifiek type voordat deze overeenkomt.

Wijzig de naam van het type var of gebruik een expliciet type in het patroon (CS8508). Wanneer een type met de naam var binnen het bereik valt, is de syntaxis van het var patroon dubbelzinnig. De compiler kan niet bepalen of u het var patroon wilt gebruiken of verwijst naar het type. Gebruik de volledig gekwalificeerde typenaam of wijzig de naam van het type om het conflict te voorkomen.

Gebruik @_ om te verwijzen naar een type met de naam _, of gebruik var _ voor het verwijderingspatroon (CS8513). Wanneer een type met de naam _ binnen het bereik valt, kan de compiler niet bepalen of het _ in een patroon verwijst naar het type of het verwijderingspatroon.

Gebruik geen patroonkoppeling met aanwijzertypen (CS8521). Aanwijzertypen worden niet ondersteund in patroonkoppelingsexpressies. Gebruik in plaats daarvan expliciete vergelijkingen of typecasts.

Gebruik een ondersteund type met relationele patronen (CS8781, CS8782). Relationele patronen (<, >, <=, >=) werken alleen met numerieke typen die ondersteuning bieden voor vergelijking. Ze kunnen niet worden gebruikt met NaN-waarden omdat NaN-vergelijkingen altijd false opleveren.

Gebruik het onderliggende type rechtstreeks in patronen bij het werken met typen die niet nullable kunnen worden gemaakt (CS8978). Typen zoals System.Nullable<T>, pointertypen, en ref struct typen kunnen niet null zijn. U moet het basistype gebruiken in de patroonkoppelingslogica.

Gebruik typepatronen om algemene numerieke typen te beperken tot specifieke numerieke typen voordat u numerieke constanten of relationele patronen (CS9060) toepast. U kunt algemene numerieke typen die INumberBase<T> rechtstreeks worden geïmplementeerd niet vergelijken met behulp van numerieke constanten en relatiepatronen. De compiler kan niet bepalen welk specifiek numeriek type wordt vergeleken. U moet eerst de waarde beperken tot een concreet numeriek type, zoals int, doubleof decimal.

Zie Nullable value types, Patterns en Generic math voor meer informatie over typepatronen.

Fouten in lijstpatronen

  • CS8979: Lijstpatronen kunnen niet worden gebruikt voor een waarde van het type ....
  • CS8980: Segmentpatronen kunnen slechts eenmaal en rechtstreeks in een lijstpatroon worden gebruikt.
  • CS8985: Lijstpatronen kunnen niet worden gebruikt voor een waarde van het type .... Er is geen geschikte eigenschap 'Length' of 'Count' gevonden.
  • CS9013: Een tekenreeks 'null' constante wordt niet ondersteund als patroon voor .... Gebruik in plaats daarvan een lege tekenreeks.

Zorg ervoor dat het type de vereiste bewerkingen voor lijstpatronen ondersteunt. Lijstpatronen vereisen typen die kunnen worden geteld en geïndexeerbaar (CS8979, CS8985). Het type moet een toegankelijke Length of Count eigenschap hebben en ondersteuning bieden voor indexering. Runtimetypen die lijstpatronen ondersteunen, zijn matrices, List<T>Span<T>en andere verzamelingstypen met de juiste leden.

Plaats segmentpatronen (..) rechtstreeks in een lijstpatroon. Gebruik ze slechts eenmaal per lijstpatroon omdat ze niet kunnen worden weergegeven in geneste patronen of buiten lijstpatronen (CS8980).

Gebruik bij het matchen van Span<char> of ReadOnlySpan<char> types een lege tekenreeks "" in plaats van een string-nullconstante. De letterlijke gegevens null worden niet ondersteund als patroon voor spantypen (CS9013).

Zie Lijstpatronen en -patronen voor meer informatie over vereisten voor lijstpatronen en syntaxis.

Subpatroonfouten

  • CS8502: Voor het overeenkomende tupletype zijn subpatronen vereist, maar er zijn onjuiste subpatronen aanwezig.
  • CS8503: Voor een subpatroon van een eigenschap moet worden verwezen naar de eigenschap of het veld, bijvoorbeeld {{ Naam: waarde }}.
  • CS8512: De naam '_' verwijst naar de constante, niet naar het verwijderingspatroon. Gebruik var _om de waarde te negeren of @_om naar een constante met die naam te verwijzen.
  • CS8516: De naam identificeert geen tuple-element.
  • CS8517: De naam komt niet overeen met de bijbehorende parameter Deconstruct.
  • CS8522: Elementnamen zijn niet toegestaan wanneer patroonkoppeling via System.Runtime.CompilerServices.ITuple wordt gebruikt.
  • CS8525: Een variabele-aanduiding moet volgen op een eigenschapspatroon.
  • CS8780: Een variabele kan niet worden gedeclareerd binnen een 'not' of 'or'-patroon.
  • CS8918: Id of een eenvoudige toegang tot leden verwacht.

Geef het juiste aantal subpatronen op wanneer het overeenkomt met een tuple-type (CS8502). Het aantal subpatronen in een positioneel patroon moet overeenkomen met het aantal elementen in het tupeltype. Voeg subpatronen toe of verwijder deze zodat deze overeenkomen met de ariteit van de tuple.

Neem de eigenschap of veldnaam op in subpatronen van eigenschappen (CS8503). Elke eigenschapssubpatroon moet opgeven welke eigenschap of welk veld moet overeenkomen. Gebruik de syntaxis { PropertyName: pattern } om het lid te identificeren.

Gebruiken var _ voor het verwijderingspatroon of @_ voor een constante met de naam _ (CS8512). Wanneer een constante met de naam _ binnen het bereik valt, verwijst het bare _ in een case label naar de constante. Om het weggooipatroon te gebruiken, schrijft u var _ in plaats daarvan.

Gebruik de juiste elementnamen in positionele patronen voor tuples (CS8516) en gedeconstrueerde typen (CS8517). Wanneer u subpatronen in een positioneel patroon noemt, moeten de namen overeenkomen met de tuple-elementnamen of de parameternamen van de Deconstruct methode.

Gebruik geen elementnamen in positionele patronen wanneer ze overeenkomen via ITuple (CS8522). Wanneer een type wordt vergeleken via de ITuple interface in plaats van via een Deconstruct methode, zijn er geen benoemde elementen. Verwijder de elementnamen uit het patroon.

Plaats de variabele aanduiding na het eigenschapspatroon, niet ervoor, maar erna (CS8525). In een eigenschapspatroon met een variabele-aanduiding moet de naam van de variabele na de sluitende accolade van het patroon komen. Schrijf bijvoorbeeld { Length: > 0 } s in plaats s { Length: > 0 }van .

U kunt geen variabelen declareren binnen not of or patrooncombinaties (CS8780). Variabeledeclaraties in not patronen worden niet zeker toegewezen en variabelen in or patronen worden slechts in één vertakking toegewezen. Verplaats de variabeledeclaratie buiten de patroon-combinator.

Gebruik een id of een eenvoudige toegangsexpressie voor leden als eigenschapsnamen in eigenschapspatronen en positionele subpatronen (CS8918). Complexe expressies, methodeaanroepen of andere niet-eenvoudige lidtoegangen zijn niet geldig als linkerzijde van een eigenschapssubpatroon. Elke subpatroonnaam moet een directe eigenschap of veldnaam zijn, of een gestippelde lidtoegangsweg zoals Property.SubProperty.

Zie Eigenschapspatroon en Positioneel patroon voor meer informatie over subpatroonsyntaxis.