Lösa varningar som rör språkfunktioner och versioner
Den här artikeln beskriver följande kompilatorvarningar:
- CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058: Funktionen är inte tillgänglig. Använd nyare språkversion.
- CS8058: Funktionen är experimentell.
- CS8192: Den angivna språkversionen stöds inte eller är ogiltig
- CS8303: Den angivna språkversionen kan inte ha inledande nolla
- CS8304: Kompilatorversionen är mindre än språkversionen
- CS1738: Namngivna argumentspecifikationer måste visas när alla fasta argument har angetts.
- CS8306: Tuppelns elementnamn härleds.
- CS8314: Ett typuttryck kan inte hanteras av ett typmönster
- CS8371: Fältriktade attribut för automatiska egenskaper stöds inte i språkversion
- CS8401: Använd
@$
nyare språkversion i stället$@
för för för en interpolerad ordagrann sträng. - CS8511: Ett typuttryck kan inte hanteras av ett typmönster.
- CS8627: En parameter av typen null måste vara känd för att vara en värdetyp eller en referenstyp som inte kan null
- CS8630: Ogiltiga null-alternativ. Använda nyare språkversion
- CS8652: Modifieraren är inte giltig för det här objektet.
- CS8704: Typen implementerar inte gränssnittsmedlem. Den kan inte implicit implementera en icke-offentlig medlem.
- CS8706: Typen kan inte implementera gränssnittsmedlem eftersom en funktion inte är tillgänglig i den här versionen.
- CS8904: Ogiltig varians: Typparametern måste vara giltig.
- CS8912: Ärver från en post med ett förseglat "Object.ToString" stöds inte.
- CS8919: Det går inte att implementera den angivna gränssnittsmedlemmen i typen eftersom målkörningen inte stöder statiska abstrakta medlemmar i gränssnitt
- CS8929: Metoden kan inte implementera gränssnittsmedlem i typ eftersom målkörningen inte stöder statiska abstrakta medlemmar i gränssnitt.
- CS8957: Villkorsuttrycket är inte giltigt i språkversion eftersom det inte gick att hitta någon vanlig typ mellan typerna.
- CS8967: Newlines i en icke-ordagrann interpolerad sträng stöds inte i C#
- CS9014: Fel: Användning av eventuellt ej tilldelad egenskap. Uppgradera till egenskapen som standard automatiskt.
- CS9015: Fel: Användning av eventuellt otilldelade fält. Uppgradera till automatiskt standard för fältet.
- CS9016: Varning: Användning av eventuellt ej tilldelad egenskap. Uppgradera till egenskapen som standard automatiskt.
- CS9017: Varning: Användning av eventuellt otilldelade fält. Uppgradera till automatiskt standard för fältet.
- CS9064: Målkörningen stöder inte referensfält.
- CS9103: Definition i en modul med en okänd RefSafetyRulesAttribute-version som förväntar sig "11".
- CS9171: Målkörningen stöder inte infogade matristyper.
- CS9194: Argumentet får inte skickas med nyckelordet
ref
. Om du vill skickaref
argument tillin
parametrar uppgraderar du till språkversion 12 eller senare. - CS9202: Funktionen är inte tillgänglig i C# 12.0. Använd nyare språkversion
- CS9211: Argumentet diagnosticId till attributet "Experimental" måste vara en giltig identifierare.
- CS9240: Målkörningen stöder inte by-ref-liknande generiska värden.
- CS9260: Funktionen är inte tillgänglig i C# 13.0. Använd nyare språkversion*
Dessutom gäller följande fel och varningar struct-initieringsändringar i de senaste versionerna:
- CS0171, CS8881: Säkerhetskopieringsfältet för den automatiskt implementerade egenskapen "name" måste tilldelas fullständigt innan kontrollen returneras till anroparen.
- CS0188, CS8885: Det här objektet kan inte användas innan alla dess fält tilldelas till
- CS0843, CS8880: Säkerhetskopieringsfältet för den automatiskt implementerade egenskapen "name" måste tilldelas fullständigt innan kontrollen returneras till anroparen
- CS8305: Funktionen är endast i utvärderingssyfte och kan komma att ändras eller tas bort i framtida uppdateringar.
- CS9204: Typen är endast i utvärderingssyfte och kan komma att ändras eller tas bort i framtida uppdateringar. Ignorera den här diagnostiken för att fortsätta.
Orsaken bakom alla dessa fel och varningar är att kompilatorn som är installerad stöder en nyare version av C# än den version som projektet har valt. C#-kompilatorn kan överensstämma med vilken tidigare version som helst. Du kan verifiera syntaxen mot en tidigare version av C#, eller för att projektet måste ha stöd för äldre bibliotek eller körningsmiljöer.
Det finns två möjliga orsaker och tre sätt att åtgärda dessa fel och varningar.
Kompilatorn fastställer ett standardvärde baserat på dessa regler:
Mål | Version | Standard för C#-språkversion |
---|---|---|
.NET | 9.x | C# 13 |
.NET | 8.x | C# 12 |
.NET | 7.x | C# 11 |
.NET | 6.x | C# 10 |
.NET | 5.x | C# 9.0 |
.NET Core | 3.x | C# 8.0 |
.NET Core | 2.x | C# 7.3 |
.NET Standard | 2.1 | C# 8.0 |
.NET Standard | 2.0 | C# 7.3 |
.NET Standard | 1.x | C# 7.3 |
.NET Framework | alla | C# 7.3 |
Om det valda ramverket inte matchar den språkversion som krävs kan du uppgradera målramverket.
Du kan ha valt ett äldre målramverk i projektfilen. Om du tar bort elementet LangVersion
från projektfilen använder kompilatorn standardvärdet som anges i föregående avsnitt. I följande tabell visas alla aktuella C#-språkversioner. Du kan också ange en specifik språkversion för att aktivera nyare funktioner.
Värde | Innebörd |
---|---|
preview |
Kompilatorn accepterar alla giltiga språksyntaxer från den senaste förhandsversionen. |
latest |
Kompilatorn accepterar syntax från den senaste versionen av kompilatorn (inklusive delversion). |
latestMajor eller default |
Kompilatorn accepterar syntax från den senaste versionen av huvudversionen av kompilatorn. |
13.0 |
Kompilatorn accepterar endast syntax som ingår i C# 13 eller lägre. |
12.0 |
Kompilatorn accepterar endast syntax som ingår i C# 12 eller lägre. |
11.0 |
Kompilatorn accepterar endast syntax som ingår i C# 11 eller lägre. |
10.0 |
Kompilatorn accepterar endast syntax som ingår i C# 10 eller lägre. |
9.0 |
Kompilatorn accepterar endast syntax som ingår i C# 9 eller lägre. |
8.0 |
Kompilatorn accepterar endast syntax som ingår i C# 8.0 eller lägre. |
7.3 |
Kompilatorn accepterar endast syntax som ingår i C# 7.3 eller lägre. |
7.2 |
Kompilatorn accepterar endast syntax som ingår i C# 7.2 eller lägre. |
7.1 |
Kompilatorn accepterar endast syntax som ingår i C# 7.1 eller lägre. |
7 |
Kompilatorn accepterar endast syntax som ingår i C# 7.0 eller lägre. |
6 |
Kompilatorn accepterar endast syntax som ingår i C# 6.0 eller lägre. |
5 |
Kompilatorn accepterar endast syntax som ingår i C# 5.0 eller lägre. |
4 |
Kompilatorn accepterar endast syntax som ingår i C# 4.0 eller lägre. |
3 |
Kompilatorn accepterar endast syntax som ingår i C# 3.0 eller lägre. |
ISO-2 eller 2 |
Kompilatorn accepterar endast syntax som ingår i ISO/IEC 23270:2006 C# (2.0). |
ISO-1 eller 1 |
Kompilatorn accepterar endast syntax som ingår i ISO/IEC 23270:2003 C# (1.0/1.2). |
Du kan lära dig mer om de språkversioner som stöds för varje ramverksversion i artikeln konfigurera språkversion i avsnittet språkreferens.
Om du måste ha stöd för äldre bibliotek eller körningar kan du behöva undvika att använda nyare funktioner.
Diagnostiken för experimentella funktioner kan inaktiveras för att använda den experimentella funktionen.
Varning
Experimentella funktioner kan komma att ändras. API:erna kan ändras eller tas bort i framtida uppdateringar. Att inkludera experimentella funktioner är ett sätt för biblioteksförfattare att få feedback om idéer och begrepp för framtida utveckling. Var mycket försiktig när du använder alla funktioner som markerats som experimentella.
Du kan också deklarera dina egna experimentella funktioner med hjälp av System.Diagnostics.CodeAnalysis.ExperimentalAttribute. Kompilatorn genererar CS9211 om identifieraren som används för den experimentella funktionen inte är en giltig identifierare.
Alla dessa fel och varningar hjälper till att säkerställa att struct
typerna initieras korrekt innan fälten används. I tidigare versioner av C#måste du uttryckligen tilldela alla fält i en struct i någon konstruktor. Den parameterlösa konstruktorn initierar alla fält till standardvärdet. I senare versioner initierar alla konstruktorer alla fält. Antingen anges fältet explicit, anges i en fältinitierare eller anges till standardvärdet.
- CS0171, CS8881: Säkerhetskopieringsfältet för den automatiskt implementerade egenskapen "name" måste tilldelas fullständigt innan kontrollen returneras till anroparen.
- CS0188, CS8885: Det här objektet kan inte användas innan alla dess fält tilldelas till
- CS0843, CS8880: Säkerhetskopieringsfältet för den automatiskt implementerade egenskapen "name" måste tilldelas fullständigt innan kontrollen returneras till anroparen
Du kan åtgärda det här felet genom att uppgradera språkversionen till C# 11, varje struct
konstruktor initierar alla fält. Om det inte är ett möjligt alternativ måste du uttryckligen anropa standardkonstruktorn, som du ser i följande exempel:
struct S
{
public int AIProp { get; set; }
public S(int i){} //CS0843
// Try the following lines instead.
// public S(int i) : this()
// {
// AIProp = i;
// }
}
class Test
{
static int Main()
{
return 1;
}
}
Feedback om .NET
.NET är ett öppen källkod projekt. Välj en länk för att ge feedback: