Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här artikeln beskriver följande kompilatorfel:
- CS0132: "konstruktor": en statisk konstruktor måste vara parameterlös.
- CS0514: statisk konstruktor kan inte ha ett explicit konstruktoranrop för "this" eller "base".
- CS0515: åtkomstmodifierare tillåts inte på statiska konstruktorer.
- CS0516: Konstruktor 'konstruktor' kan inte anropa sig själv.
- CS0517: "class" har ingen basklass och kan inte anropa en baskonstruktor.
- CS0522: structs kan inte anropa basklasskonstruktorer.
- CS0526: Interfaces får inte innehålla konstruktorer.
- CS0568: Structs kan inte innehålla explicita parameterlösa konstruktorer.
- CS0573: "fältdeklaration": kan inte ha instansfältinitierare i structs.
- CS0710: Statiska klasser kan inte ha instanskonstruktorer.
- CS0768: Konstruktorn kan inte anropa sig själv via en annan konstruktor.
- CS1018: Nyckelordet "this" eller "base" förväntades.
- CS8054: Uppräkningar får inte innehålla explicita parameterlösa konstruktorer.
- CS8091: kan inte vara extern och ha en konstruktorinitierare.
- CS8861: Oväntad argumentlista.
- CS8862: En konstruktor som deklareras i en typ med parameterlista måste ha konstruktorinitieraren "this".
- CS8358: Det går inte att använda attributkonstruktorn eftersom den har in-parametrar.
- CS8867: Ingen tillgänglig kopieringskonstruktor hittades i bastypen '{0}'.
- CS8868: En kopieringskonstruktor i en post måste anropa en kopieringskonstruktor för basen eller en parameterlös objektkonstruktor om posten ärver från objektet.
- CS8878: En kopieringskonstruktor{0}måste vara offentlig eller skyddad eftersom posten inte är förseglad.
- CS8910: Den primära konstruktorn står i konflikt med den syntetiserade kopieringskonstruktorn.
- CS8958: Den parameterlösa structkonstruktorn måste vara "offentlig".
- CS8982: En konstruktor som deklareras i en "struct" med parameterlistan måste ha en "den här" initieraren som anropar den primära konstruktorn eller en uttryckligen deklarerad konstruktor.
- CS8983: En "struct" med fältinitierare måste innehålla en uttryckligen deklarerad konstruktor.
- CS9105: Det går inte att använda den primära konstruktorparametern i den här kontexten.
- CS9106: Identifieraren är tvetydig mellan typ och parameter i den här kontexten.
- CS9108: Det går inte att använda parameter som har ref-liknande typ i en anonym metod, lambda-uttryck, frågeuttryck eller lokal funktion.
-
CS9109: Kan inte använda
ref,outellerinprimär konstruktorparameter i en instansmedlem. - CS9110: Det går inte att använda den primära konstruktorparametern som har ref-liknande typ i en instansmedlem.
- CS9111: Anonyma metoder, lambda-uttryck, frågeuttryck och lokala funktioner i en instansmedlem i en struct kan inte komma åt den primära konstruktorparametern.
- CS9112: Anonyma metoder, lambda-uttryck, frågeuttryck och lokala funktioner i en struct kan inte komma åt den primära konstruktorparametern som också används i en instansmedlem.
- CS9114: En primär konstruktorparameter av skrivskyddad typ kan inte tilldelas (förutom i init-only setter av typen eller en variabelinitierare).
- CS9115: En primär konstruktorparameter av skrivskyddad typ kan inte returneras med skrivbar referens.
- CS9116: En primär konstruktorparameter av skrivskyddad typ kan inte användas som referens- eller utvärde (förutom i init-only setter av typen eller en variabelinitierare).
- CS9117: Medlemmar av den primära konstruktorparametern av skrivskyddad typ kan inte ändras (förutom i init-only setter av typen eller en variabelinitierare).
- CS9118: Medlemmar av primärkonstruktorens parameter i en skrivskyddad typ kan inte returneras med skrivbar referens.
-
CS9119: Medlemmar av en primärkonstruktors parameter av skrivskyddad typ kan inte användas som ett
ref- ellerout-värde (förutom i ett init-only setter för typen eller en variabelinitialisering). - CS9120: Det går inte att returnera den primära konstruktorparametern med referens.
- CS9121: Huvudkonstruktorns parameter av typen orsakar en cykel i strukturens layout.
- CS9122: oväntad parameterlista.
- CS9136: Det går inte att använda den primära konstruktorparametern av typen inuti en instansmedlem.
Dessutom beskrivs följande varningar i den här artikeln:
- CS0824: Konstruktorns namn markeras externt.
- CS9107: Parametern fångas in i tillståndet för den omslutande typen och dess värde skickas också till baskonstruktorn. Värdet kan också samlas in av basklassen.
- CS9113: Parametern är oläst.
- CS9124: Parametern fångas in i tillståndet för den omslutande typen och dess värde används också för att initiera ett fält, en egenskap eller en händelse.
- CS9179: Primär konstruktorparameter skuggas av en medlem från
- CS9018: Den automatiskt implementerade egenskapen läss innan den uttryckligen tilldelas, vilket orsakar en föregående implicit tilldelning av "standard".
- CS9019: Fältet läss innan det uttryckligen tilldelas, vilket orsakar en föregående implicit tilldelning av "standard".
- CS9020: Objektet "det här" läss innan alla dess fält har tilldelats, vilket gör att implicita tilldelningar av "standard" föregås av icke-explicit tilldelade fält.
- CS9021: Kontrollen returneras till anroparen innan den automatiskt implementerade egenskapen uttryckligen tilldelas, vilket orsakar en föregående implicit tilldelning av "standard".
- CS9022: Kontrollen returneras till anroparen innan fältet uttryckligen tilldelas, vilket orsakar en föregående implicit tilldelning av "standard".
Statiska konstruktorer
- CS0132: "konstruktor": en statisk konstruktor måste vara parameterlös.
- CS0514: Static-konstruktorn kan inte ha ett explicit konstruktoranrop för "this" eller "base".
- CS0515: Åtkomstmodifierare tillåts inte på statiska konstruktorer.
Statiska konstruktorer initierar statiska data för en typ. Mer information finns i Statiska konstruktorer.
Om du vill åtgärda dessa fel kontrollerar du att din statiska konstruktordeklaration följer dessa regler:
- Ta bort alla parametrar från deklarationen för statisk konstruktor eftersom en statisk konstruktor måste vara parameterlös (CS0132). Om du behöver skicka initieringsvärden bör du överväga att använda statiska fält eller egenskaper som du anger innan den statiska konstruktorn körs.
- Ta bort alla åtkomstmodifierare som
public,protected,privateellerinternalfrån den statiska konstruktorn eftersom körningskontrollerna när den statiska konstruktorn kör och åtkomstmodifierare inte är meningsfulla (CS0515). - Ta bort alla
: base()eller: this()konstruktorinitieringsanrop från den statiska konstruktorn, eftersom statiska konstruktorer inte kan länka till andra konstruktorer (CS0514). Körningen anropar automatiskt basklassens statiska konstruktor om det finns en sådan.
Konstruktordeklaration
- CS0526: Interfaces får inte innehålla konstruktorer.
- CS0710: Statiska klasser kan inte ha instanskonstruktorer.
- CS8054: Uppräkningar får inte innehålla explicita parameterlösa konstruktorer.
- CS8358: Det går inte att använda attributkonstruktorn eftersom den har in-parametrar.
- CS8091: En konstruktor kan inte vara extern och ha en konstruktorinitierare.
Du kan endast deklarera konstruktorer i class och struct typer, inklusive record class och record struct typer. Mer information finns i Instanskonstruktorer.
Prova följande förslag för att åtgärda dessa fel:
Flytta konstruktorn till en class eller struct en typ eftersom du inte kan deklarera konstruktorer i interface eller enum typer (CS0526, CS8054). Gränssnitt definierar kontrakt men tillhandahåller inte initieringslogik, och enum-enumerationstyper har sina värden definierade vid kompileringstid.
Ta bort instanskonstruktorer från statiska klasser eftersom statiska klasser inte kan instansieras och därför inte kan ha instanskonstruktorer (CS0710). Om du behöver initieringslogik använder du en statisk konstruktor i stället.
Ändra in parametrar till pass-by-value-parametrar i attributkonstruktorer, eftersom attributkonstruktorer inte stöder in parametermodifierare (CS8358). Körtiden instansierar attribut genom att använda reflection, vilket inte stöder in-modifieraren.
Ta bort : base()- eller : this()-konstruktorinitieraren från en extern-konstruktor eftersom externa konstruktorer inte kan länka till andra konstruktorer (CS8091). Implementeringen av en extern konstruktor görs utanför, så konstruktorlänkning är inte möjlig.
Följande varning kan genereras för konstruktordeklarationer:
- CS0824: Konstruktorn är markerad som extern.
När en konstruktor har markerats externkan kompilatorn inte verifiera att en implementering finns. Om du vill förhindra den här varningen anger du antingen en icke-extern implementering eller ser till att den externa implementeringen är korrekt länkad.
Konstruktorer i structtyper
- CS0568: Structs kan inte innehålla explicita parameterlösa konstruktorer.
- CS0573: "fältdeklaration": kan inte ha instansfältinitierare i structs.
- CS8958: Den parameterlösa struct-konstruktorn måste vara "public".
- CS8982: En konstruktor som deklareras i en "struct" med parameterlistan måste ha en "den här" initieraren som anropar den primära konstruktorn eller en uttryckligen deklarerad konstruktor.
- CS8983: En "struct" med fältinitierare måste innehålla en uttryckligen deklarerad konstruktor.
Struct-typer har specifika regler för konstruktorer och fältinitiering. Mer information finns i avsnittet Struct-initiering och standardvärden i artikeln Strukturtyper .
Prova följande förslag för att åtgärda dessa fel:
- Uppgradera till C# 10 eller senare om du stöter på CS0568 eller CS0573, eftersom dessa fel endast uppstår i äldre versioner av C#. Modern C# tillåter explicita parameterlösa konstruktorer och fältinitierare i structs.
- Lägg till
publicåtkomstmodifieraren till en parameterlös structkonstruktor, eftersom parameterlösa structkonstruktorer måste vara offentliga för attdefaultuttrycket och matrisallokeringen ska kunna initiera struct-instanser (CS8958). - Lägg till en
: this(...)initialiserare till explicit deklarerade konstruktorer i en struct som har en primär konstruktor, eftersom alla icke-parameterlösa konstruktorer måste länkas till den primära konstruktorn eller någon annan uttryckligen deklarerad konstruktor för att säkerställa konsekvent initiering (CS8982). - Deklarera en explicit konstruktor när din struct använder fältinitierare, eftersom kompilatorn kräver en explicit konstruktor för att säkerställa att fältinitierare anropas (CS8983). Konstruktorn kan vara en parameterlös konstruktor med en tom kropp.
Följande varningar indikerar att ett fält eller en egenskap inte uttryckligen har tilldelats innan de läss eller innan kontrollen återgår till anroparen:
- CS9018: Den automatiskt implementerade egenskapen läss innan den uttryckligen tilldelas, vilket orsakar en föregående implicit tilldelning av "standard".
- CS9019: Fältet läss innan det uttryckligen tilldelas, vilket orsakar en föregående implicit tilldelning av "standard".
- CS9020: 'This'-objektet läses innan alla dess fält har tilldelats, vilket medför att föregående implicita tilldelningar av 'default' inträffar vid fält som inte tilldelas explicit.
- CS9021: Kontrollen returneras till anroparen innan den automatiskt implementerade egenskapen uttryckligen tilldelas, vilket orsakar en föregående implicit tilldelning av "standard".
- CS9022: Kontrollen returneras till anroparen innan fältet uttryckligen tilldelas, vilket orsakar en föregående implicit tilldelning av "standard".
Om du vill tysta varningarna tilldelar du uttryckligen alla fält och automatiskt implementerade egenskaper innan du läser dem eller innan kontrollen returneras från konstruktorn (CS9018, CS9019, CS9020, CS9021, CS9022). När otilldelade medlemmar läses gör kompilatorn en implicit tilldelning av default till dem, vilket kanske inte är det avsedda beteendet.
Konstruktoranrop med base och this
- CS0516: Konstruktorn kan inte anropa sig själv.
- CS0517: "class" har ingen basklass och kan inte anropa en baskonstruktor.
- CS0522: Structs kan inte anropa basklasskonstruktorer.
- CS0768: Konstruktorn kan inte anropa sig själv via en annan konstruktor.
- CS1018: Nyckelordet "this" eller "base" förväntades.
Genom att använda konstruktorinitierare kan en konstruktor anropa en annan konstruktor med hjälp av : this() eller : base(). Mer information finns i Använda konstruktorer.
Prova följande förslag för att åtgärda dessa fel:
- Bryt alla cirkelformade konstruktoranropskedjor eftersom en konstruktor inte kan anropa sig själv direkt eller indirekt via en annan konstruktor (CS0516, CS0768). Se till att kedjan av konstruktörer stannar vid en konstruktor som inte anropar en annan konstruktor av samma typ.
-
: base()Ta bort initieraren från konstruktorer i structtyper eller från konstruktorer i System.Object, eftersom dessa typer inte har någon basklasskonstruktor att anropa (CS0517, CS0522). Struct-typer ärver implicit från System.ValueType, men du kan inte uttryckligen anropa konstruktorn. - Slutför konstruktorinitieraren eller ta bort kolonet (
:) från konstruktordeklarationen, eftersom kompilatorn förväntar sig antingenthis()ellerbase()(CS1018) när ett kolon följer en konstruktorsignatur. Lägg antingen till lämpligt konstruktoranrop eller ta bort kolonet helt om ingen länkning är avsedd.
Register och kopieringskonstruktorer
- CS8867: Ingen tillgänglig kopieringskonstruktor hittades i bastypen.
- CS8868: En kopieringskonstruktor i ett rekord måste anropa en kopieringskonstruktor av basen eller en parameterlös objektkonstruktor om rekordet ärver från objekt.
- CS8878: En kopieringskonstruktor måste vara offentlig eller skyddad eftersom posten inte är förseglad.
- CS8910: Den primära konstruktorn står i konflikt med den syntetiserade kopieringskonstruktorn.
I en härledd posttyp måste den explicita kopieringskonstruktorn anropa bastypens kopieringskonstruktor med hjälp av : this() initieraren. Om posten ärver direkt från System.Object, kan den anropa den parameterlösa objektkonstruktorn i stället (CS8868).
Records innehåller en av kompilatorn genererad kopieringskonstruktor. Du kan definiera en explicit kopieringskonstruktor, men den måste uppfylla specifika krav. Kompilatorn genererar fel när postkopieringskonstruktorer bryter mot dessa krav:
- Bastypen måste ha en tillgänglig kopieringskonstruktor. Alla
recordtyper har en kopieringskonstruktor. Kontrollera att bastypen är enrecord, eller lägg till en tillgänglig kopieringskonstruktor i den (CS8867). - I en härledd posttyp måste den tydliga kopieringskonstruktor anropa bastypens kopieringskonstruktor med hjälp av
: base()-initieraren. Om posten ärver direkt från System.Object kan den anropa den parameterlösa objektkonstruktorn i stället (CS8868). - Kopieringskonstruktorer måste vara
publicellerprotectedsåvida inte posttypen ärsealed. Lägg till lämplig åtkomstmodifierare i kopieringskonstruktorn (CS8878). - Om den explicita kopieringskonstruktorn har samma signatur som den syntetiserade kopieringskonstruktorn, är definitionerna i konflikt. Ta bort den explicita kopieringskonstruktorn eller ändra dess signatur (CS8910).
Primär konstruktordeklaration
Primära konstruktorer deklarerar parametrar direkt i typdeklarationen. Kompilatorn syntetiserar ett fält för att lagra en primär konstruktorparameter när du använder den i medlemmar eller fältinitierare.
Konstruktorkedja
- CS8861: Oväntad argumentlista.
- CS8862: En konstruktor som deklareras i en typ med parameterlista måste ha konstruktorinitieraren "this".
- CS9122: Oväntad parameterlista.
När en typ har en primär konstruktor, måste alla andra uttryckligen deklarerade konstruktorer kedja sig till den genom att använda : this(...). Lägg till en : this(...) initialiserare som skickar lämpliga argument till den primära konstruktorn (CS8862).
Ta bort en parameterlista från bastypsreferensen när bastypen inte har någon primär konstruktor. Syntaxen class Derived : Base(args) är endast giltig när Base den har en primär konstruktor (CS8861). På samma sätt tar du bort en primär konstruktorparameterlista från en interface deklaration, eftersom gränssnitt inte kan ha primära konstruktorer (CS9122).
Parameteranvändning i baskonstruktoranrop
- CS9105: Det går inte att använda den primära konstruktorparametern i den här kontexten.
- CS9106: Identifierare är tvetydig mellan typ och parameter i den här kontexten.
Du kan bara använda primära konstruktorparametrar i baskonstruktoranropet om du skickar dem som en del av den primära konstruktordeklarationen. Om du vill åtgärda CS9105 flyttar du parameteranvändningen till typdeklarationens bassats i stället för att använda den i ett uttryckligt deklarerat konstruktoranrop : base() .
Om en typ och en primär konstruktorparameter delar samma namn blir referensen tvetydig. Om du vill åtgärda CS9106 byter du namn på antingen typen eller parametern.
Referensliknande typparametrar
- CS9108: Det går inte att använda parameter som har ref-liknande typ i en anonym metod, lambda-uttryck, frågeuttryck eller lokal funktion.
-
CS9109: Kan inte använda
ref,outellerinprimär konstruktorparameter i en instansmedlem. - CS9110: Det går inte att använda den primära konstruktorparametern som har referensliknande typ i en instansmedlem.
- CS9136: Det går inte att använda den primära konstruktorparametern av typen inuti en instansmedlem.
Så här åtgärdar du följande fel:
- Primära konstruktorparametrar av
ref structtypen har begränsningar för var du kan använda dem. Flytta parameteråtkomsten från lambda-uttryck, frågeuttryck eller lokala funktioner (CS9108). I typer som interef struct, åtkomst till parameterarref structsker endast i fältinitierare eller konstruktorns kropp, inte i instansmedlemmar (CS9110, CS9136). - För
ref structtyper kan du inte använda primära konstruktorparametrar medin,refelleroutmodifierare i instansmetoder eller egenskapsåtkomster. Kopiera parametervärdet till ett fält i konstruktorn och använd fältet i instansmedlemmar i stället (CS9109).
Begränsningar av strukturtyp
- CS9111: Anonyma metoder, lambda-uttryck, frågeuttryck och lokala funktioner i en instansmedlem i en struct kan inte komma åt den primära konstruktorparametern.
- CS9112: Anonyma metoder, lambda-uttryck, frågeuttryck och lokala funktioner i en struct kan inte komma åt den primära konstruktorparametern som också används i en instansmedlem.
- CS9120: Det går inte att returnera den primära konstruktorparametern med referens.
- CS9121: Struct primär konstruktorparameter av typen orsakar en cykel i struct-layouten.
Så här åtgärdar du följande fel:
- I strukturer kan du inte fånga primärkonstruktorns parametrar i lambda-uttryck, frågeuttryck eller lokala funktioner inne i instansens medlemmar. Kopiera parametern till en lokal variabel eller ett fält innan du använder den i dessa kontexter (CS9111, CS9112).
- Du kan inte returnera primära konstruktorparametrar med referens i structtyper. Lagra värdet i ett fält och returnera det fältet som referens om det behövs (CS9120).
- Se till att en primär konstruktorparameters typ inte skapar en cykel i struct-layouten. En struct får inte innehålla ett fält av egen typ, antingen direkt eller indirekt (CS9121).
Readonly struct-begränsningar
- CS9114: En primär konstruktorparameter av skrivskyddad typ kan inte tilldelas (förutom i init-only setter av typen eller en variabelinitierare).
- CS9115: En primär konstruktorparameter av skrivskyddad typ kan inte returneras som en skrivbar referens.
-
CS9116: En primär konstruktorparameter av skrivskyddad typ kan inte användas som ett
refelleroutvärde (förutom i init-only setter av typen eller en variabelinitierare). - CS9117: Medlemmar av den primära konstruktorparametern av skrivskyddad typ kan inte ändras (förutom i init-only setter av typen eller en variabelinitierare).
- CS9118: Medlemmar av den primära konstruktorparametern av skrivskyddad typ kan inte returneras med skrivbar referens.
-
CS9119: Medlemmar av en primär konstruktorparameter av skrivskyddad typ kan inte användas som ett
ref- ellerout-värde (förutom i init-only setter av typen eller en variabelinitierare).
Så här åtgärdar du följande fel:
- I
readonly structtyper kan du inte ändra primära konstruktorparametrar och deras medlemmar utanför init-only-setters eller variabelinitierare. Flytta tilldelningar till fältinitierare eller init-only property setters (CS9114, CS9117). - Du kan inte returnera primära konstruktorparametrar och deras medlemmar genom skrivbar referens i
readonly structtyper. Returnera medreadonly refeller efter värde i stället (CS9115, CS9118). - Du kan inte skicka primära konstruktorparametrar och deras medlemmar som
refelleroutargument ireadonly structtyper. Skicka dem efter värde eller sominargument i stället (CS9116, CS9119).
Varningar för insamlade och skuggade parametrar
- CS9107: Parametern fångas in i tillståndet för den omslutande typen och dess värde skickas också till baskonstruktorn. Värdet kan också samlas in av basklassen.
- CS9113: Parametern är oläst.
- CS9124: Parametern fångas in i tillståndet för den omslutande typen och dess värde används också för att initiera ett fält, en egenskap eller en händelse.
- CS9179: Den primära konstruktorparametern skuggas av en medlem från basen.
Följande varningar anger potentiella problem med hur du lagrar eller kommer åt primära konstruktorparametrar:
- Du kan lagra en parameter två gånger om du både skickar den till baskonstruktorn och kommer åt den i den härledda typen. Du kan ha en kopia i basklassen och en annan i den härledda klassen. Överväg om du behöver båda kopiorna eller omstrukturera koden för att undvika dupliceringen (CS9107).
- Du behöver ingen primär konstruktorparameter om du aldrig läser den. Ta bort oanvända parametrar från den primära konstruktordeklarationen (CS9113).
- Du kan lagra en parameter två gånger om du både avbildar den i den omslutande typen och använder den för att initiera ett fält, en egenskap eller en händelse. Överväg att använda den insamlade parametern direkt i stället för att initiera en separat medlem (CS9124).
- En bastypmedlem skuggar en primär konstruktorparameter när båda har samma namn. Byt namn på parametern för att undvika förvirring (CS9179).