Lösa fel och varningar i mönstermatchningsuttryck

Den här artikeln beskriver följande kompilatorfel och varningar:

  • CS8116: Det är inte lagligt att använda nullbar typ i ett mönster. Använd den underliggande typen i stället.
  • CS8117: Ogiltig operand för mönstermatchning; värde krävs, men hittade uttryck.
  • CS8119: Växlingsuttrycket måste vara ett värde; ett uttryck hittades.
  • CS8120: Växelfallet kan inte nås. Det har redan hanterats av ett tidigare fall eller så är det omöjligt att matcha.
  • CS8121: Ett uttryck av källtyp kan inte hanteras av ett mönster av måltyp.
  • CS8208: Det är inte lagligt att använda typen "dynamisk" i ett mönster.
  • CS8502: För att matcha tupletypen krävs antecknade undermönster, men felaktiga undermönster finns.
  • CS8503: Ett egenskapsundermönster kräver att en referens till egenskapen eller fältet matchas, t.ex. {{ Namn: värde }}.
  • CS8504: Mönster saknas
  • CS8505: Standardliteralen "default" är inte giltig som ett mönster. Använd en annan literal (t.ex. "0" eller "null") efter behov. Om du vill matcha allt använder du ett ignorerande mönster '_'.
  • CS8506: Ingen bästa typ hittades för switch-uttrycket.
  • CS8508: Syntaxen 'var' i ett mönster är inte tillåten att användas för att referera till en typ, men var typen finns i omfånget här.
  • CS8509: Växlingsuttrycket hanterar inte alla möjliga värden av sin indatatyp (det är inte uttömmande). Till exempel mönstret "..." omfattas inte.
  • CS8510: Mönstret kan inte nås. Det har redan hanterats av en tidigare arm i switchuttrycket eller så är det omöjligt att matcha.
  • CS8512: Namnet '_' refererar till konstanten, inte ignoreringsmönstret. Använd 'var _ ' för att ignorera värdet eller '@_ ' om du vill referera till en konstant med det namnet.
  • CS8513: Namnet '_' refererar till typen _, inte ignorera-mönstret. Använd '@_ ' för typen eller 'var _ ' för att ignorera.
  • CS8515: Parenteser krävs runt växelns styrande uttryck.
  • CS8516: Namnet identifierar inte ett tupppelelement{1} .
  • CS8517: Namnet matchar inte motsvarande dekonstruktionsparameter.
  • CS8518: Ett uttryck av den här typen kan aldrig matcha det angivna mönstret.
  • CS8519: Det angivna uttrycket matchar aldrig det angivna mönstret.
  • CS8520: Det angivna uttrycket matchar alltid den angivna konstanten.
  • CS8521: Mönstermatchning är inte tillåtet för pekartyper.
  • CS8522: Elementnamn tillåts inte vid mönstermatchning via "System.Runtime.CompilerServices.ITuple".
  • CS8523: Mönstret ignorera tillåts inte som en ärendeetikett i en switch-instruktion. Använd "case var _:" för ett ignorerande mönster, eller "case @_:" för en konstant med namnet '_'.
  • CS8524: Växeluttrycket hanterar inte vissa värden av dess indatatyp (det är inte fullständigt) på grund av ett namnlöst uppräkningsvärde.
  • CS8525: En variabeldesignator måste komma efter ett egenskapsmönster.
  • CS8780: En variabel kan inte deklareras inom ett "inte" eller "eller"-mönster.
  • CS8781: Relationsmönster kanske inte används för ett värde av den här typen.
  • CS8782: Relationella mönster kan inte användas för ett flyttalets NaN.
  • CS8793: Det angivna uttrycket matchar alltid det angivna mönstret.
  • CS8794: Ett uttryck av typen "{0}" matchar alltid det angivna mönstret.
  • CS8846: Växeluttrycket hanterar inte alla möjliga värden av sin indatatyp (det är inte uttömmande). Det här mönstret omfattas till exempel inte. Ett mönster med en "when"-sats kan dock matcha det här värdet.
  • CS8918: Identifierare eller enkel medlemsåtkomst förväntas.
  • CS8978: '...' kan inte göras null.
  • CS8979: Listmönster kanske inte används för ett värde av typen ....
  • CS8980: Segmentmönster kan bara användas en gång och direkt i ett listmönster.
  • CS8985: Listmönster kanske inte används för ett värde av typen .... Det gick inte att hitta någon lämplig egenskap för "Längd" eller "Antal".
  • CS9013: En sträng "null"-konstant stöds inte som ett mönster för .... Använd en tom sträng i stället.
  • CS9060: Det går inte att använda ett numeriskt konstant- eller relationsmönster på ... eftersom den ärver från eller utökar "INumberBase<T>". Överväg att använda ett typmönster för att begränsa till en specifik numerisk typ.
  • CS9134: En växeluttrycksarm börjar inte med nyckelordet "case".
  • CS9135: Ett konstant värde av typen förväntas
  • CS9336: Mönstret är redundant.
  • CS9337: Mönstret är för komplext för att analysera för redundans.
  • CS9344: Operatorn '==' stöds inte i ett mönster.
  • CS9345: Operatorn '!=' stöds inte i ett mönster. Använd "inte" för att representera ett negerat mönster.

Växla uttryckssyntaxfel

  • CS8119: Växlingsuttrycket måste vara ett värde; uttrycket som hittades var det.
  • CS8504: Mönster saknas
  • CS8505: Standardliteralen "default" är inte giltig som ett mönster. Använd en annan literal (t.ex. "0" eller "null") efter behov. Om du vill matcha allt använder du ett ignorerande mönster '_'.
  • CS8506: Ingen bästa typ hittades för switch-uttrycket.
  • CS8515: Parenteser krävs runt växelns styrande uttryck.
  • CS8523: Mönstret ignorera tillåts inte som en ärendeetikett i en switch-instruktion. Använd "case var _:" för ett ignorerande mönster, eller "case @_:" för en konstant med namnet '_'.
  • CS9134: En arm av ett switch-uttryck börjar inte med nyckelordet ”case”.
  • CS9135: Ett konstant värde av typen förväntas
  • CS9344: Operatorn '==' stöds inte i ett mönster.
  • CS9345: Operatorn '!=' stöds inte i ett mönster. Använd "inte" för att representera ett negerat mönster.

Ange ett värde som styruttrycket för en switch-sats eller ett uttryck (CS8119). Det styrande uttrycket måste generera ett värde. Typer, namnområden, metodgrupper och void-returning-metoder är inte giltiga. Använd ett uttryck som utvärderas till ett värde.

Ange ett mönster där en är förväntad (CS8504). En switcharm eller uttryck med ett is-uttryck kräver ett mönster efter rätt syntax. Se till att du inkluderar ett giltigt mönsteruttryck.

Använd inte literalen default som ett mönster (CS8505). Nyckelordet default är inte giltigt i mönstermatchning. Använd ett specifikt literalvärde som 0 eller null istället, eller använd bortkastningsmönstret _ för att matcha valfritt värde.

Ange en explicit typ för switchuttrycksresultatet när kompilatorn inte kan härleda den bästa typen från armarna (CS8506). Det här felet uppstår när armarna returnerar värden av olika typer som inte delar en gemensam typ som kompilatorn kan härleda automatiskt, till exempel metodgrupper eller lambdas. Tilldela resultatet till en explicit typvariabel i stället för att använda var.

Omsluta det styrande uttrycket för en switch instruktion inom parenteser och brödtexten i klammerparenteser (CS8515). Instruktionen switch kräver parenteser runt uttrycket som utvärderas och klammerparenteser runt brödtexten. Det här felet uppstår när parenteser eller klammerparenteser saknas.

Använd case var _: istället för det ensamma discard-tecknet _ som en etikett i en switch-sats (CS8523). Mönstret bare discard tillåts inte i switch-instruktioner på grund av tvetydighet med en konstant med namnet _. Använd case var _: för att ignorera eller case @_: för att matcha en konstant med namnet _.

Ta bort nyckelordet case från växla uttrycksarmar. Switch-uttryck använder en annan syntax än switch-satser (CS9134). I switch-uttryck består varje arm av ett mönster följt av => token och ett uttryck, utan nyckelordet case som används i switch-uttryck. Använd konstanta värden i stället för variabler i mönster. Mönstermatchning kräver kompileringstidskonstanter (CS9135). Variabler kan inte användas som mönster. Kompilatorn måste känna till de exakta värdena vid kompileringstiden för att generera lämplig matchande kod.

Använd relationsmönsteroperatorer (<, >, <=, >=) eller nyckelordet not i stället för == och != operatorer i mönster (CS9344, CS9345). Likhets- och ojämlikhetsoperatorerna stöds inte i mönstersyntaxen. Använd ett konstant mönster för likhet och nyckelordet not för ojämlikhet.

Mer information om rätt syntax finns i Växla uttryck.

Mönsterfullständighet och redundans

  • CS8120: Växelfallet kan inte nås. Det har redan hanterats av ett tidigare fall eller så är det omöjligt att matcha.
  • CS8509: Växlingsuttrycket hanterar inte alla möjliga värden av sin indatatyp (det är inte uttömmande). Till exempel mönstret "..." omfattas inte.
  • CS8510: Mönstret kan inte nås. Det har redan hanterats av en tidigare arm i switchuttrycket eller så är det omöjligt att matcha.
  • CS8518: Ett uttryck av typen kan aldrig matcha det angivna mönstret.
  • CS8519: Det angivna uttrycket matchar aldrig det angivna mönstret.
  • CS8520: Det angivna uttrycket matchar alltid den angivna konstanten.
  • CS8524: Switch-uttrycket hanterar inte vissa värden av sin indatatyp (det är inte uttömmande) som involverar ett namnlöst enum-värde. Det nämnda mönstret täcks till exempel inte.
  • CS8793: Det angivna uttrycket matchar alltid det angivna mönstret.
  • CS8794: Ett typuttryck matchar alltid det angivna mönstret.
  • CS8846: Växeluttrycket hanterar inte alla möjliga värden av sin indatatyp (det är inte uttömmande). Det antecknade mönstret omfattas till exempel inte. Ett mönster med en "when"-sats kan dock matcha det här värdet.
  • CS9336: Mönstret är redundant.
  • CS9337: Mönstret är för komplext för att analysera för redundans.

Ändra ordning på eller ta bort ärendeetiketter som inte kan nås i switch instruktioner (CS8120). En case etikett kan inte nås när ett tidigare fall redan hanterar alla värden som det senare fallet skulle matcha. Detta inträffar när ett mer allmänt mönster visas före ett mer specifikt mönster, eller när mönstret är omöjligt att matcha för indatatypen.

Lägg till switcharmar som hanterar alla möjliga indatavärden för att skapa uttömmande växeluttryck (CS8509, CS8524, CS8846). Switch-uttryck måste täcka alla möjliga värden för indatatypen. Annars kan kompilatorn inte garantera att uttrycket ger ett resultat för alla indata. Kompilatorn varnar separat för icke namngivna uppräkningsvärden (CS8524) och för fall där en when sats kan matcha ett annars ohanterat värde (CS8846). Använd mönstret ignorera (_) som en sista catch-all-arm för att matcha eventuella återstående värden som du inte behöver hantera explicit.

Ändra ordning på eller ta bort oåtkomliga switchuttrycksarmar (CS8510). Precis som CS8120 för switch -instruktioner anger det här felet att en switch-uttrycksarm inte kan nås eftersom en tidigare arm redan hanterar alla värden som den senare armen skulle matcha.

Granska mönster som aldrig kan matcha eller alltid matcha indata (CS8518, CS8519, CS8520, CS8793, CS8794). Den här diagnostiken anger att kompilatorn vid kompileringstillfället kan avgöra om ett mönster alltid eller aldrig matchar. Ett mönster som alltid matchar är redundant och ett mönster som aldrig matchar är död kod. Båda kan indikera logikfel.

Granska mönster som kompilatorn identifierar som redundanta. Redundanta mönster kan indikera ett logikfel där du tänkte använda not eller olika logiska operatorer (CS9336). Förenkla komplexa mönster som är för svåra för kompilatorn att analysera för redundans. Dela upp dem i enklare, mer underhållsbara uttryck (CS9337).

Mer information om krav på fullständighet och mönsteroptimering finns i Switch-uttryck, Switch-instruktion och Mönster.

Typmönsterfel

  • CS8116: Det är inte lagligt att använda nullbar typ i ett mönster. Använd den underliggande typen i stället.
  • CS8117: Ogiltig operand för mönstermatchning; värde krävs, men hittade uttryck.
  • CS8121: Ett uttryck av källtyp kan inte hanteras av ett mönster av måltyp.
  • CS8208: Det är inte lagligt att använda typen "dynamisk" i ett mönster.
  • CS8508: Syntaxen 'var' för ett mönster är inte tillåtet att referera till en typ, men typen var finns i omfånget här.
  • CS8513: Namnet '_' refererar till typen _, inte mönstret för att ignorera. Använd '@_' för typen eller 'var _' för att ta bort.
  • CS8521: Mönstermatchning är inte tillåtet för pekartyper.
  • CS8781: Relationala mönster får inte användas för ett värde av typen.
  • CS8782: Relationella mönster får inte användas för ett flyttals-NaN.
  • CS8978: '...' kan inte göras null.
  • CS9060: Det går inte att använda ett numeriskt konstant- eller relationsmönster på ... eftersom den ärver från eller utökar "INumberBase<T>". Överväg att använda ett typmönster för att begränsa till en specifik numerisk typ.

Använd den underliggande typen i stället för den nullbara typen i mönster (CS8116). Du kan inte använda en nullbar värdetyp som int? direkt i ett typmönster. Använd i stället den underliggande typen (int) och mönstret matchar både null- och icke-nullbara värden.

Ange ett värde som operand för en mönstermatchning (CS8117). Den vänstra sidan av ett is uttryck måste vara ett värde, inte en typ, ett namnområde eller en metodgrupp. Tilldela resultatet till en variabel först eller använd ett annat uttryck som genererar ett värde.

Använd en mönstertyp som är kompatibel med uttryckstypen (CS8121). Kompilatorn genererar det här felet när det inte finns någon möjlig konvertering mellan uttryckstypen och mönstertypen. Du kan till exempel inte matcha ett string uttryck mot ett int typmönster. Ändra mönstertypen till en som är kompatibel med uttrycket eller omvandla uttrycket till en kompatibel typ.

Använd dynamic inte som typ i ett mönster (CS8208). Typen dynamic stöds inte i mönstermatchning. Använd object i stället eller omvandla värdet till en viss typ innan matchning.

Byt namn på typen var eller använd en explicit typ i mönstret (CS8508). När en typ med namnet var finns i omfånget är mönstersyntaxen var tvetydig. Kompilatorn kan inte avgöra om du tänker använda var mönstret eller referera till typen. Använd det fullständigt kvalificerade typnamnet eller byt namn på typen för att undvika konflikten.

Använd @_ för att referera till en typ med namnet _, eller använd var _ för mönstret ignorera (CS8513). När en typ med namnet _ finns i omfånget kan kompilatorn inte avgöra om _ i ett mönster refererar till typen eller kasseringsmönstret.

Använd inte mönstermatchning med pekartyper (CS8521). Pekartyper stöds inte i mönstermatchningsuttryck. Använd explicita jämförelser eller gjutningar i stället.

Använd en typ som stöds med relationsmönster (CS8781, CS8782). Relationsmönster (<, >, <=, >=) fungerar bara med numeriska typer som stöder jämförelse. De kan inte användas med NaN-värden eftersom NaN-jämförelser alltid returnerar false.

Använd den underliggande typen direkt i mönster när du arbetar med typer som inte kan göras nullbara (CS8978). Typer som System.Nullable<T>, pekartyper och referensstruktureringstyper kan inte göras nullbara. Du måste använda bastypen i din mönstermatchningslogik.

Använd typmönster för att begränsa generiska numeriska typer till specifika numeriska typer innan du tillämpar numeriska konstanter eller relationsmönster (CS9060). Du kan inte matcha generiska numeriska typer som implementeras INumberBase<T> direkt med hjälp av numeriska konstanter eller relationsmönster. Kompilatorn kan inte avgöra vilken specifik numerisk typ som matchas. Du måste först begränsa värdet till en konkret numerisk typ som int, doubleeller decimal.

Mer information om typmönster finns i Nullable värdetyper, Mönster och Generisk matematik.

Lista över mönsterfel

  • CS8979: Listmönster kanske inte används för ett värde av typen ....
  • CS8980: Segmentmönster kan bara användas en gång och direkt i ett listmönster.
  • CS8985: Listmönster kanske inte används för ett värde av typen .... Det gick inte att hitta någon lämplig egenskap för "Längd" eller "Antal".
  • CS9013: En sträng "null"-konstant stöds inte som ett mönster för .... Använd en tom sträng i stället.

Kontrollera att typen stöder de åtgärder som krävs för listmönster. Listmönster kräver typer som kan räknas och indexeras (CS8979, CS8985). Typen måste ha en tillgänglig Length egenskap eller Count egenskap och ha stöd för indexering. Körningstyper som stöder listmönster inkluderar matriser, List<T>, Span<T>och andra samlingstyper med lämpliga medlemmar.

Placera segmentmönster (..) direkt i ett listmönster. Använd dem bara en gång per listmönster eftersom de inte kan visas i kapslade mönster eller utanför listmönster (CS8980).

När du matchar Span<char>- eller ReadOnlySpan<char>-typer, använder du en tom sträng "" i stället för null-strängkonstanten. Literalen null stöds inte som ett mönster för spantyper (CS9013).

Mer information om krav och syntax för listmönster finns i Lista mönster och mönster.

Submönsterfel

  • CS8502: För att matcha tuppelns typ krävs undermönster, men felaktiga undermönster finns.
  • CS8503: Ett egenskapsundermönster kräver att en referens till egenskapen eller fältet matchas, t.ex. {{ Namn: värde }}.
  • CS8512: Namnet '_' refererar till konstanten, inte mönstret ignorera. Använd var _för att ignorera värdet eller @_om du vill referera till en konstant med det namnet.
  • CS8516: Namnet identifierar inte tuppelns element.
  • CS8517: Namnet matchar inte motsvarande dekonstruktionsparameter.
  • CS8522: Elementnamn tillåts inte vid mönstermatchning via "System.Runtime.CompilerServices.ITuple".
  • CS8525: En variabeldesignator måste komma efter ett egenskapsmönster.
  • CS8780: En variabel kan inte deklareras inom ett "inte" eller "eller"-mönster.
  • CS8918: Identifierare eller enkel medlemsåtkomst förväntas.

Ange rätt antal undermönster när du matchar en tupppeltyp (CS8502). Antalet undermönster i ett positionsmönster måste matcha antalet element i tuppelns typ. Lägg till eller ta bort undermönster för att matcha tuplens aritet.

Inkludera egenskapen eller fältnamnet i egenskapsunderavsnitt (CS8503). Varje egenskapsundermönster måste ange vilken egenskap eller vilket fält som ska matchas. Använd syntaxen { PropertyName: pattern } för att identifiera medlemmen.

Använd var _ för mönstret för kasserande eller @_ för en konstant som heter _ (CS8512). När en konstant med namnet _ finns i omfånget refererar den tomma _ i en case etikett till konstanten. Om du vill använda mönstret Ignorera skriver du var _ i stället.

Använd rätt elementnamn i positionsmönster för tupplar (CS8516) och dekonstruerade typer (CS8517). När du namnger undermönster i ett positionsmönster måste namnen matcha tuppelns elementnamn eller metodparameternamnen Deconstruct .

Använd inte elementnamn i positionsmönster vid matchning via ITuple (CS8522). När en typ matchas via ITuple gränssnittet i stället för via en Deconstruct metod finns det inga namngivna element. Ta bort elementnamnen från mönstret.

Placera variabeldesignatorn efter egenskapsmönstret, inte före det (CS8525). I ett egenskapsmönster med en variabelbeteckning måste variabelnamnet följa mönstrets avslutande klammerparentes. Skriv till exempel { Length: > 0 } s i stället s { Length: > 0 }för .

Du kan inte deklarera variabler inom not eller or mönsterkombinatorer (CS8780). Variabeldeklarationer i not mönster tilldelas inte definitivt, och variabler i or mönster tilldelas bara i en gren. Flytta variabeldeklarationen utanför mönsterkombinatorn.

Använd en identifierare eller ett enkelt medlemsåtkomstuttryck som egenskapsnamn i egenskapsmönster och positionsundermönster (CS8918). Komplexa uttryck, metodanrop eller andra icke-enkla medlemsåtkomster är inte giltiga som vänster sida av ett egenskapsundermönster. Varje underordnat namn måste vara en direkt egenskap eller ett fältnamn, eller en streckad medlemsåtkomstsökväg som Property.SubProperty.

Mer information om underordnad syntax finns i Egenskapsmönster och Positionsmönster.