Waarschuwingen met betrekking tot taalfuncties en -versies oplossen
In dit artikel worden de volgende compilerwaarschuwingen behandeld:
- CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058: Functie is niet beschikbaar. Gebruik een nieuwere taalversie.
- CS8058: Functie is experimenteel.
- CS8192: Opgegeven taalversie wordt niet ondersteund of ongeldig
- CS8303: opgegeven taalversie mag geen voorloopnullen hebben
- CS8304: Compilerversie is kleiner dan taalversie
- CS1738: Specificaties van benoemde argumenten moeten worden weergegeven nadat alle vaste argumenten zijn opgegeven.
- CS8306: De naam van het Tuple-element wordt afgeleid.
- CS8314: Een expressie van het type kan niet worden verwerkt door een patroon van het type
- CS8371: Op velden gerichte kenmerken voor automatische eigenschappen worden niet ondersteund in taalversie
- CS8401: Als u in plaats van
$@
een geïnterpoleerde verbatimtekenreeks wilt gebruiken@$
, gebruikt u een nieuwere taalversie. - CS8511: Een expressie van het type kan niet worden verwerkt door een patroon van het type.
- CS8627: Een parameter van een null-type moet bekend zijn als een waardetype of niet-null-verwijzingstype
- CS8630: Ongeldige null-opties. Nieuwere taalversie gebruiken
- CS8652: De wijzigingsfunctie is niet geldig voor dit item.
- CS8704: Type implementeert geen interfacelid. Het kan geen niet-openbaar lid impliciet implementeren.
- CS8706: Type kan geen interfacelid implementeren omdat een functie niet beschikbaar is in deze versie.
- CS8904: Ongeldige variantie: de parameter van het type moet geldig zijn.
- CS8912: Overnemen van een record met een verzegeld object.ToString wordt niet ondersteund.
- CS8919: Kan het opgegeven interfacelid niet in het type implementeren omdat de doelruntime geen ondersteuning biedt voor statische abstracte leden in interfaces
- CS8929: De methode kan geen interfacelid in type implementeren omdat de doelruntime geen statische abstracte leden in interfaces ondersteunt.
- CS8957: Voorwaardelijke expressie is niet geldig in de taalversie omdat er geen gemeenschappelijk type is gevonden tussen typen.
- CS8967: Nieuwe regels binnen een niet-exacte geïnterpoleerde tekenreeks worden niet ondersteund in C#
- CS9014: Fout: Gebruik van mogelijk niet-toegewezen eigenschap. Voer een upgrade uit naar de eigenschap die automatisch wordt gebruikt.
- CS9015: Fout: Gebruik van mogelijk niet-toegewezen veld. Voer een upgrade uit naar de automatische standaardwaarde van het veld.
- CS9016: Waarschuwing: Gebruik van mogelijk niet-toegewezen eigenschap. Voer een upgrade uit naar de eigenschap die automatisch wordt gebruikt.
- CS9017: Waarschuwing: Gebruik van mogelijk niet-toegewezen veld. Voer een upgrade uit naar de automatische standaardwaarde van het veld.
- CS9064: Doelruntime biedt geen ondersteuning voor ref-velden.
- CS9103: Definitie in een module met een niet-herkende RefSafetyRulesAttribute-versie, verwacht '11'.
- CS9171: Doelruntime biedt geen ondersteuning voor inlinematrixtypen.
- CS9194: Argument kan niet worden doorgegeven met het
ref
trefwoord. Als u argumenten wilt doorgevenref
aanin
parameters, voert u een upgrade uit naar taalversie 12 of hoger. - CS9202: Functie is niet beschikbaar in C# 12.0. Gebruik een nieuwere taalversie
- CS9211: Het argument diagnosticId voor het kenmerk Experimenteel moet een geldige id zijn.
- CS9240: Doelruntime biedt geen ondersteuning voor generieken die op ref lijken.
- CS9260: Functie is niet beschikbaar in C# 13.0. Gebruik een nieuwere taalversie*
Daarnaast hebben de volgende fouten en waarschuwingen betrekking op struct initialisatiewijzigingen in recente versies:
- CS0171, CS8881: Backing-veld voor automatisch geïmplementeerde eigenschap 'naam' moet volledig worden toegewezen voordat het besturingselement wordt geretourneerd aan de aanroeper.
- CS0188, CS8885: Het object 'dit' kan niet worden gebruikt voordat alle velden zijn toegewezen aan
- CS0843, CS8880: Backing-veld voor automatisch geïmplementeerde eigenschap 'name' moet volledig worden toegewezen voordat het besturingselement wordt geretourneerd aan de aanroeper
- CS8305: Functie is alleen bedoeld voor evaluatiedoeleinden en kan in toekomstige updates worden gewijzigd of verwijderd.
- CS9204: Type is alleen bedoeld voor evaluatiedoeleinden en kan in toekomstige updates worden gewijzigd of verwijderd. Deze diagnose onderdrukken om door te gaan.
De oorzaak achter al deze fouten en waarschuwingen is dat de geïnstalleerde compiler een nieuwere versie van C# ondersteunt dan de versie die uw project heeft geselecteerd. De C#-compiler kan voldoen aan een eerdere versie. U kunt syntaxis valideren op basis van een eerdere versie van C# of omdat uw project oudere bibliotheken of runtimes moet ondersteunen.
Er zijn twee mogelijke oorzaken en drie manieren om deze fouten en waarschuwingen op te lossen.
Uw doelframework bijwerken
De compiler bepaalt een standaardwaarde op basis van deze regels:
Doel | Versie | Standaardtaalversie van C# |
---|---|---|
.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 | Alles | C# 7.3 |
Als het geselecteerde framework niet overeenkomt met de taalversie die is vereist, kunt u het doelframework upgraden.
Selecteer de overeenkomende taalversie
Mogelijk hebt u een ouder doelframework geselecteerd in uw projectbestand. Als u het LangVersion
element uit het projectbestand verwijdert, gebruikt de compiler de standaardwaarde die in de vorige sectie wordt vermeld. In de volgende tabel ziet u alle huidige C#-taalversies. U kunt ook een specifieke taalversie opgeven om nieuwere functies in te schakelen.
Weergegeven als | Betekenis |
---|---|
preview |
De compiler accepteert alle geldige taalsyntaxis uit de nieuwste preview-versie. |
latest |
De compiler accepteert syntaxis van de meest recente uitgebrachte versie van de compiler (inclusief secundaire versie). |
latestMajor of default |
De compiler accepteert syntaxis van de meest recente primaire versie van de compiler. |
13.0 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 13 of lager. |
12.0 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 12 of lager. |
11.0 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 11 of lager. |
10.0 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 10 of lager. |
9.0 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 9 of lager. |
8.0 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 8.0 of lager. |
7.3 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 7.3 of lager. |
7.2 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 7.2 of lager. |
7.1 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 7.1 of lager. |
7 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 7.0 of lager. |
6 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 6.0 of lager. |
5 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 5.0 of lager. |
4 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 4.0 of lager. |
3 |
De compiler accepteert alleen syntaxis die is opgenomen in C# 3.0 of lager. |
ISO-2 of 2 |
De compiler accepteert alleen syntaxis die is opgenomen in ISO/IEC 23270:2006 C# (2.0). |
ISO-1 of 1 |
De compiler accepteert alleen syntaxis die is opgenomen in ISO/IEC 23270:2003 C# (1.0/1.2). |
Meer informatie over de taalversies die worden ondersteund voor elke frameworkversie vindt u in het artikel over taalversie configureren in de sectie Taalreferentie.
Vermijd de bijgewerkte functie
Als u oudere bibliotheken of runtimes moet ondersteunen, moet u mogelijk het gebruik van nieuwere functies voorkomen.
Experimentele functies inschakelen
De diagnostische gegevens voor experimentele functies kunnen worden uitgeschakeld om de experimentele functie te gebruiken.
Waarschuwing
Experimentele functies zijn onderhevig aan wijzigingen. De API's kunnen worden gewijzigd of worden verwijderd in toekomstige updates. Het opnemen van experimentele functies is een manier voor bibliotheekauteurs om feedback te krijgen over ideeën en concepten voor toekomstige ontwikkeling. Wees uiterst voorzichtig wanneer u een functie gebruikt die is gemarkeerd als experimenteel.
U kunt ook uw eigen experimentele functies declareren met behulp van de System.Diagnostics.CodeAnalysis.ExperimentalAttribute. De compiler verzendt CS9211 als de id die wordt gebruikt voor de experimentele functie geen geldige id is.
Belangrijke wijzigingen bij struct-initialisatie
Al deze fouten en waarschuwingen helpen ervoor te zorgen dat struct
typen correct worden geïnitialiseerd voordat hun velden worden geopend. In eerdere versies van C# moet u expliciet alle velden in een struct in een constructor toewijzen. De constructor zonder parameter initialiseert alle velden naar de standaardwaarde. In latere versies initialiseren alle constructors alle velden. Het veld is expliciet ingesteld, ingesteld in een veldinitiator of ingesteld op de standaardwaarde.
- CS0171, CS8881: Backing-veld voor automatisch geïmplementeerde eigenschap 'naam' moet volledig worden toegewezen voordat het besturingselement wordt geretourneerd aan de aanroeper.
- CS0188, CS8885: Het object 'dit' kan niet worden gebruikt voordat alle velden zijn toegewezen aan
- CS0843, CS8880: Backing-veld voor automatisch geïmplementeerde eigenschap 'name' moet volledig worden toegewezen voordat het besturingselement wordt geretourneerd aan de aanroeper
U kunt deze fout oplossen door uw taalversie te upgraden naar C# 11. Elke struct
constructor initialiseert alle velden. Als dat niet mogelijk is, moet u de standaardconstructor expliciet aanroepen, zoals wordt weergegeven in het volgende voorbeeld:
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;
}
}