Lösa fel och varningar för konstruktordeklarationer och modulinitierare

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: Konstruktorn '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: Gränssnitt får inte innehålla instanskonstruktorer.
  • 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.
  • CS8358: Det går inte att använda attributkonstruktorn eftersom den har parametrarna "in" eller "ref readonly".
  • CS8813: En modulinitierare måste vara en vanlig medlemsmetod
  • CS8814: Modulinitierarens metod måste vara tillgänglig på modulnivå
  • CS8815: Modulinitieringsmetoden "method" måste vara statisk och icke-virtuell, får inte ha några parametrar och måste returnera "void"
  • CS8816: Modulinitierarens metod får inte vara generisk och får inte finnas i en generisk typ
  • CS8861: Oväntad argumentlista.
  • CS8862: En konstruktor som deklareras i en typ med parameterlista måste ha konstruktorinitieraren "this".
  • 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.
  • CS8900: Modulinitieraren kan inte tillskrivas "UnmanagedCallersOnly".
  • CS8901: "method" tillskrivs "UnmanagedCallersOnly" och kan inte anropas direkt. Hämta en funktionspekare till den här metoden.
  • CS8902: "method" är försedd med "UnmanagedCallersOnly" och kan inte konverteras till en delegetyp. Hämta en funktionspekare till den här metoden.
  • 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, outeller in primä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- eller out-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 fält tilldelas, vilket gör att implicita tilldelningar av "default" 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, privateeller internal frå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: Gränssnitt får inte innehålla instanskonstruktorer.
  • 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 parametrarna "in" eller "ref readonly".
  • 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 eller ref readonly parametrar till pass-by-value-parametrar i attributkonstruktorer, eftersom attributkonstruktorer inte stöder in eller ref readonly parametermodifierare (CS8358). Körningen instansierar attribut med hjälp av reflektion, som inte stöder modifieraren in eller ref readonly .
  • 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 att default uttrycket 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 antingen this() eller base() (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 record typer har en kopieringskonstruktor. Kontrollera att bastypen är en record, eller lägg till en tillgänglig kopieringskonstruktor i den (CS8867).
  • I en härledd posttyp måste den explicita kopieringskonstruktorn 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 public eller protected såvida inte posttypen är sealed. 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).

Modulinitieringsdeklarationer

  • CS8813: En modulinitierare måste vara en vanlig medlemsmetod.
  • CS8814: Modulinitierarens metod måste vara tillgänglig på modulnivå.
  • CS8815: Modulinitierarens metod måste vara statisk och icke-virtuell, får inte ha några parametrar och måste returnera "void".
  • CS8816: Modulinitierarens metod får inte vara generisk och får inte finnas i en allmän typ.
  • CS8900: Modulinitieraren kan inte tillskrivas "UnmanagedCallersOnly".
  • CS8901: "method" tillskrivs "UnmanagedCallersOnly" och kan inte anropas direkt. Hämta en funktionspekare till den här metoden.
  • CS8902: "metod" tillskrivs "UnmanagedCallersOnly" och kan inte konverteras till en delegattyp. Hämta en funktionspekare till den här metoden.

Dessa fel framtvingar kraven för metoder som har markerats med ModuleInitializerAttribute. Modulinitierare körs automatiskt när en sammansättning läses in först innan någon annan kod i modulen körs. Fullständiga regler finns i Modulinitierare.

Åtgärda dessa fel genom att tillämpa någon av följande ändringar baserat på den specifika diagnostiken:

  • Se till att metoden som är markerad med [ModuleInitializer] är en vanlig metod, inte en egenskapsaccessor, händelseaccessor, lokal funktion, lambda, konstruktor, destruktor eller operator (CS8813). Kompilatorn kan bara behandla en vanlig metoddeklaration som ett giltigt mål för modulinitierarens infrastruktur.
  • För att metoden ska vara tillgänglig utanför den översta nivån, gör modulinitieringsmetoden och alla dess innehållande typer internal eller public (CS8814). Körningen måste anropa metoden från kod som genererats på modulnivå, vilket kräver åtkomlighet på modulnivå.
  • Deklarera modulinitieringsmetoden som static, icke-virtuell, utan parametrar och med en void returtyp (CS8815). Körningen anropar modulinitierare utan argument och tar bort resultatet, så metodsignaturen måste matcha dessa begränsningar exakt.
  • Ta bort generiska typparametrar från modulinitieringsmetoden och flytta metoden från alla generiska typer (CS8816). Körningen kan inte avgöra vilken typ av argument som ska anges när initieraren anropas, så generiska metoder och metoder i generiska typer tillåts inte.
  • Ta bort UnmanagedCallersOnlyAttribute från modulinitieringsmetoden (CS8900). Modulinitierare anropas av en hanterad körningsinfrastruktur, så de kan inte begränsas till ohanterade anropare.
  • Hämta en funktionspekare i stället för att anropa en metod som markerats med [UnmanagedCallersOnly] direkt (CS8901). Metoder som tillskrivs UnmanagedCallersOnlyAttribute kan inte anropas från hanterad kod. Använd operatorn & för att hämta en funktionspekare (delegate* unmanaged<...>) i en unsafe kontext och skicka pekaren till ohanterad kod. Om projektet inte redan tillåter osäker kod aktiverar du AllowUnsafeBlocks.
  • Hämta en funktionspekare i stället för att konvertera en metod som markerats med [UnmanagedCallersOnly] till en delegetyp (CS8902). Metoder kopplade till UnmanagedCallersOnlyAttribute kan inte representeras som hanterade delegater eftersom anropskonventionen är inkompatibel. Använd funktionspekare (delegate* unmanaged<...>) i en unsafe kontext i stället. Om projektet inte redan tillåter osäker kod aktiverar du AllowUnsafeBlocks.

Mer information finns i ModuleInitializerAttribute och UnmanagedCallersOnlyAttribute.

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(...).

Prova följande förslag för att åtgärda dessa fel:

  • Lägg till en : this(...) initialiserare som skickar lämpliga argument till den primära konstruktorn, eftersom alla uttryckligen deklarerade konstruktorer måste länkas till den primära konstruktorn (CS8862).
  • Ta bort en parameterlista från bastypsreferensen när bastypen inte har någon primär konstruktor, eftersom syntaxen class Derived : Base(args) endast är giltig när Base den har en primär konstruktor (CS8861).
  • Ta 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.

Prova följande förslag för att åtgärda dessa fel:

  • Flytta parameteranvändningen till typdeklarationens bassats i stället för att använda den i ett uttryckligt deklarerat konstruktoranrop : base() , eftersom primära konstruktorparametrar bara kan visas i bassatsen i typdeklarationen (CS9105).
  • Byt namn på antingen typen eller parametern när en typ och en primär konstruktorparameter delar samma namn, eftersom referensen blir tvetydig (CS9106).

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, outeller in primä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 struct typen 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 inte ref struct, åtkomst till parameterar ref struct sker endast i fältinitierare eller konstruktorns kropp, inte i instansmedlemmar (CS9110, CS9136).
  • För ref struct typer kan du inte använda primära konstruktorparametrar med in, refeller out modifierare 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 ref eller out vä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- eller out-värde (förutom i init-only setter av typen eller en variabelinitierare).

Så här åtgärdar du följande fel:

  • I readonly struct typer 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 struct typer. Returnera med readonly ref eller efter värde i stället (CS9115, CS9118).
  • Du kan inte skicka primära konstruktorparametrar och deras medlemmar som ref eller out argument i readonly struct typer. Skicka dem efter värde eller som in argument 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).