Dela via


Fel och varningar som rör egenskapsdeklarationer

Du kan stöta på följande fel som rör egenskapsdeklarationer:

  • CS0200: Egenskapen eller indexer kan inte tilldelas – den är endast läsbar
  • CS0545: "function" : kan inte åsidosättas eftersom "egenskapen" inte har en åsidosättningsbar get-accessor
  • CS0571: 'funktion' : kan inte göra ett uttryckligt anrop till operatorn eller accessorn
  • CS0840: Egenskapsnamn måste deklarera en brödtext eftersom den inte är markerad som abstrakt eller extern. Automatiskt implementerade egenskaper måste definiera både get- och set-åtkomstorer.
  • CS1014: En get- eller set-åtkomstmetod förväntas
  • CS1043: { eller ; förväntades
  • CS8050: Endast automatiskt implementerade egenskaper, eller egenskaper som använder nyckelordet "fält", kan ha initialiserare
  • CS8051: Autoimplementerade egenskaper måste ha 'get' accessor
  • CS8053: Instansegenskaper i gränssnitt kan inte ha initialiserare
  • CS8145: Auto-implementerade egenskaper kan inte returneras med referens
  • CS8147: Egenskaper som returneras med referens kan inte ha angett åtkomst
  • CS8341: Automatiskt implementerade instansegenskaper i skrivskyddade strukturer måste vara skrivskyddade
  • CS8657: Statisk medlem kan inte markeras "readonly"
  • CS8658: Den automatiskt implementerade "set"-åtkomstorn kan inte markeras "skrivskyddat"
  • CS8659: Den automatiskt implementerade egenskapen kan inte markeras "readonly" eftersom den har en "set"-accessor
  • CS8660: Det går inte att ange 'readonly' modifierare för både egenskapen och dess accessor
  • CS8661: Det går inte att ange 'readonly'-modifierare för båda accessorerna av egenskapen
  • CS8664: "readonly" kan endast användas på accessorer om egenskapen har både hämta och inställt
  • CS9029: Typer och alias kan inte namnges ”required”.
  • CS9030: Medlemmen måste vara obligatorisk eftersom den åsidosätter nödvändig medlem.
  • CS9031: Obligatorisk medlem kan inte döljas av härledd medlem.
  • CS9032: Den obligatoriska medlemmen kan inte vara mindre synlig eller ha en setter som är mindre synlig än den innehållande typen.
  • CS9033: Använd inte .System.Runtime.CompilerServices.RequiredMemberAttribute' Använd nyckelordet "obligatoriskt" i obligatoriska fält och egenskaper i stället.
  • CS9034: Obligatorisk medlem måste vara konfigurerbar.
  • CS9035: Obligatorisk medlem måste anges i objektinitieraren eller attributkonstruktorn.
  • CS9036: Obligatorisk medlem "memberName" måste tilldelas ett värde, den kan inte använda en kapslad medlem eller samlingsinitierare.
  • CS9037: Listan över medlemmar som krävs är felaktigt formaterad och kan inte tolkas.
  • CS9038: Listan över medlemmar som krävs för bastypen är felaktig och kan inte tolkas. Använd attributet 'SetsRequiredMembers' om du vill använda den här konstruktorn.
  • CS9039: Den här konstruktorn måste lägga till 'SetsRequiredMembers' eftersom den kedjar till en konstruktor som har det attributet.
  • CS9040: Typen kan inte uppfylla villkoret förnew() parametern i den generiska typen eller metoden eftersom den har nödvändiga medlemmar.
  • CS9042: Obligatorisk medlem ska inte tillskrivas "ObsoleteAttribute" om inte den innehållande typen är föråldrad eller alla konstruktorer är föråldrade.
  • CS9045: Obligatoriska medlemmar tillåts inte på den översta nivån i ett skript eller en sändning.
  • CS9258: I den här språkversionen binder nyckelordet "field" till ett syntetiserat bakgrundsfält för egenskapen. Om du vill undvika att generera ett syntetiserat bakgrundsfält och referera till den befintliga medlemmen använder du "this.field" eller "@field" i stället.
  • CS9263: En partiell egenskap kan inte ha en initierare för både definitionen och implementeringen.

Följande varningar kan genereras för fältbaserade egenskaper:

  • CS9264: Icke-nullbar egenskap måste innehålla ett värde som inte är null när konstruktorn avslutas. Överväg att lägga till den nödvändiga modifieraren, deklarera egenskapen som nullbar eller lägga till[field: MaybeNull, AllowNull] attribut.
  • CS9266: En egenskapsåtkomst bör använda eftersomfield den andra accessorn använder den.
  • CS9273: I den här språkversionen är "field" ett nyckelord i en egenskapsåtkomst. Byt namn på variabeln eller använd identifieraren i@field stället.

I följande avsnitt förklaras orsaken och korrigeringarna för dessa fel och varningar.

Syntax för åtkomst av egenskaper

  • CS0545: "function" : kan inte åsidosättas eftersom "egenskapen" inte har en åsidosättningsbar get-accessor
  • CS0571: "function" : kan inte uttryckligen anropa operatorn eller accessorn
  • CS1043: { eller ; förväntades

Om du vill korrigera fel med egenskapsåtkomstsyntaxen tillämpar du någon av följande ändringar baserat på den specifika diagnostiken:

Åsidosätt endast de accessorer som finns i basklassens egenskapsdeklaration (CS0545). Du kan inte åsidosätta en egenskapsaccessor som inte finns eller är tillgänglig i basklassen eftersom det inte finns någon virtuell metod att åsidosätta i den kompilerade IL:n. Om basklassegenskapen bara har en get accessor, ta bort set-accessorn från din åsidosättning, eller lägg till den saknade accessorn i basklassen och markera den som virtual. Du kan också använda nyckelordet new i stället för override att dölja basklassegenskapen med en helt ny egenskapsdefinition som har olika åtkomst.

Få åtkomst till egenskaper med egenskapssyntax i stället för att anropa åtkomstmetoder direkt (CS0571). Egenskapsåtkomster kompileras till särskilda metoder med namn som get_PropertyName och set_PropertyName, men du bör anropa dessa metoder via egenskapssyntaxen (obj.Property och obj.Property = value). Den här metoden upprätthåller rätt semantik och gör det möjligt för kompilatorn att utföra nödvändiga kontroller. Samma princip gäller för operatorer som kompilerar till metoder som op_Increment men bör anropas med operatorsyntax (++obj) i stället för metodanrop.

Använd korrekt egenskapsåtkomstsyntax med klammerparenteser eller uttryckskroppar (CS1043). Egenskapsåtkomster måste följa C#-syntaxregler: Accessor-organ måste omges av klammerparenteser { }, uttrycksbaserade accessorer måste använda syntaxen => och automatiskt implementerade egenskaper måste sluta med semikolon efter åtkomstlistan. Kompilatorn förväntar sig antingen en fullständig implementering av accessor eller semikolonet som anger en automatiskt implementerad accessor.

Mer information finns i Egenskaper, Arv och Använda egenskaper.

Auto-implementerade egenskaper

  • CS0840: Egenskapsnamn måste deklarera en brödtext eftersom den inte är markerad som abstrakt eller extern. Automatiskt implementerade egenskaper måste definiera både get- och set-åtkomstorer.
  • CS1014: En get- eller set-åtkomstmetod förväntas

Om du vill korrigera automatiskt implementerade egenskapsfel tillämpar du någon av följande ändringar baserat på den specifika diagnostiken:

Lägg till både get och set accessorer i egenskapsdeklarationen (CS0840). För automatiskt implementerade egenskaper krävs att kompilatorn genererar ett bakgrundsfält, och kompilatorn kan bara göra detta när båda åtkomstgivarna finns för att säkerställa att lagringen kan både läsas och skrivas. Om du behöver en skrivskyddad automatisk implementerad egenskap ska du inkludera en set accessor och göra det private för att begränsa skrivåtkomsten samtidigt som kompilatorn kan generera det stödjande fältet. Alternativt, om egenskapen deklareras som abstract eller extern, ska du ta bort accessor-metoderna helt eftersom dessa modifierare indikerar att implementeringen tillhandahålls någon annanstans. För partial egenskaper kan du dela upp deklarationen och implementeringen mellan partiella typdeklarationer.

Kontrollera att egenskapsdeklarationen endast innehåller giltiga accessor-nyckelord som get och set (CS1014). Egenskapssyntax tillåter endast åtkomstdeklarationer, inte godtyckliga instruktioner eller medlemsdeklarationer i egenskapstexten. Om du behöver ytterligare logik implementerar du egenskapen med explicita åtkomstorgan som innehåller din kod. Om du försöker deklarera fält eller metoder flyttar du dessa deklarationer utanför egenskapen till klassens eller en structs kropp där medlemsdeklarationer tillåts.

Mer information finns i Egenskaper och Automatiskt implementerade egenskaper.

Fältstödda egenskaper

  • CS9258: I den här språkversionen binder nyckelordet "field" till ett syntetiserat bakgrundsfält för egenskapen. Om du vill undvika att generera ett syntetiserat bakgrundsfält och referera till den befintliga medlemmen använder du "this.field" eller "@field" i stället.
  • CS9263: En partiell egenskap kan inte ha en initierare för både definitionen och implementeringen.
  • CS9264: Icke-nullbar egenskap måste innehålla ett värde som inte är null när konstruktorn avslutas. Överväg att lägga till den nödvändiga modifieraren, deklarera egenskapen som nullbar eller lägga till[field: MaybeNull, AllowNull] attribut.
  • CS9266: En egenskapsåtkomst bör använda eftersomfield den andra accessorn använder den.
  • CS9273: I den här språkversionen är "field" ett nyckelord i en egenskapsåtkomst. Byt namn på variabeln eller använd identifieraren i@field stället.

Om du vill korrigera fältstödda egenskapsfel tillämpar du någon av följande ändringar baserat på den specifika diagnostiken:

Byt namn på en variabel med namnet field till en annan identifierare eller använd escape-syntaxen @field för att referera till variabeln (CS9258, CS9273). Den här korrigeringen är nödvändig eftersom field är ett kontextuellt nyckelord i egenskapsåtkomsterna i C# 13 och senare, där den refererar till det kompilatorsyntetiserade bakgrundsfältet. Om du vill komma åt en befintlig medlem med namnet field i stället för det syntetiserade bakgrundsfältet kvalificerar du det med this.field för att skilja referensen åt.

Ta bort initieraren från antingen den partiella egenskapsdefinitionen eller implementeringen och behåll bara en (CS9263). Den här korrigeringen krävs eftersom initiering på båda platserna skulle skapa tvetydighet om vilket värde som ska användas och kan leda till att bakgrundsfältet initieras två gånger med potentiellt olika värden.

Lägg till attributen [field: MaybeNull, AllowNull] i egenskapsdeklarationen för att ange att bakgrundsfältet ska behandlas som nullbart (CS9264). Den här korrigeringen justerar förväntningarna på nullabilitet mellan egenskapstypen och det kompilatorsyntetiserade bakgrundsfältet, vilket löser matchningsfelet där egenskapen deklareras som icke-nullbar, men nyckelordsanvändningen field antyder att den kan vara null. Du kan också ändra egenskapstypen till nullbar, lägga till required modifieraren för att säkerställa initiering eller initiera egenskapen i konstruktorn.

Använd antingen nyckelordet field i båda åtkomstmetoderna eller använd ett explicit bakomliggande fält i båda åtkomstmetoderna (CS9266). Den här korrigeringen förhindrar potentiella buggar där en accessor ändrar det kompilatorsyntetiserade bakgrundsfältet medan den andra accessorn ändrar en annan lagringsplats, vilket leder till inkonsekvent egenskapsbeteende.

Mer information finns i fältnyckelord och partiella egenskaper.

Skrivskyddade egenskaper

  • CS0200: Egenskapen eller indexerarens egenskap kan inte tilldelas – den är skrivskyddad
  • CS8341: Automatiskt implementerade instansegenskaper i skrivskyddade strukturer måste vara skrivskyddade
  • CS8657: Statisk medlem kan inte markeras som readonly
  • CS8658: Den automatiskt implementerade "set"-åtkomstmetoden kan inte markeras som "readonly"
  • CS8659: Den automatiskt implementerade egenskapen kan inte markeras "readonly" eftersom den har en "set"-accessor
  • CS8660: Det går inte att ange "endast läsbar" modifierare för både egenskapen och dess accessor
  • CS8661: Det går inte att ange "skrivskyddade" modifierare för båda egenskapsåtkomsterna
  • CS8664: "readonly" kan endast användas på accessorer om egenskapen har både hämta och inställt

Om du vill korrigera skrivskyddade egenskapsfel tillämpar du någon av följande ändringar baserat på den specifika diagnostiken:

Lägg till en set eller init accessor till egenskapen för att göra den skrivbar (CS0200). Den här korrigeringen är nödvändig eftersom egenskaper utan set-tillgång är skrivskyddade och endast kan tilldelas i den deklarerande typens konstruktor eller fältstartare. Om du behöver att egenskapen ska anges under objektinitiering men oföränderlig efteråt använder du en init accessor i stället för en set accessor. Om egenskapen ska förbli skrivskyddad ska du flytta tilldelningen till konstruktorn där initialisering tillåts, eller överväga om tilldelningen överhuvudtaget är nödvändig.

Markera automatiskt implementerade instansegenskaper som readonly när du deklarerar dem i en readonly struct (CS8341). Den här korrigeringen tillämpar det oföränderliga kontraktet för den innehållande structen readonly , vilket säkerställer att alla instansmedlemmar respekterar garantin. Om egenskapen måste vara föränderlig tar du antingen bort readonly modifieraren från struct-deklarationen eller implementerar egenskapen med ett explicit bakgrundsfält och accessor-organ som inte ändrar instanstillståndet.

Ta bort modifieraren readonly från statisk egenskap eller åtkomstdelsdeklarationer (CS8657). Den här korrigeringen readonly krävs eftersom modifieraren endast gäller för instansmedlemmar i structs för att indikera att de inte ändrar instanstillstånd och statiska medlemmar inte har instanstillstånd att skydda. Om du behöver en skrivskyddad statisk egenskap, ska du helt enkelt utelämna åtkomstmetoden i stället för att använda modifieraren readonly.

readonly Ta bort modifieraren från automatiskt implementerade set accessorer eller tillämpa den endast på get accessorer (CS8658). Den här korrigeringen är nödvändig eftersom set accessorerna i sig ändrar tillstånd, vilket strider mot syftet med readonly modifieraren som inte garanterar någon ändring av instanstillståndet. Om du behöver en egenskap som kan anges under initieringen men är read-only efteråt, använder du en init accessor i stället för en set accessor.

readonly Ta bort modifieraren från egenskapsdeklarationen när egenskapen har en set accessor (CS8659). Den här korrigeringen krävs eftersom egenskaper med set accessorer kan ändra tillståndet för instansen, vilket strider mot readonly garantin. Om du bara behöver initieringstidsinställning, ersätt set-åtkomstmetoden med en init-åtkomstmetod eller ta bort set-åtkomstmetoden helt för att göra egenskapen verkligt skrivskyddad.

readonly Placera modifieraren antingen på egenskapsdeklarationen eller på enskilda accessorer, men inte båda (CS8660, CS8661). Den här korrigeringen förhindrar redundanta modifierardeklarationer som kan skapa förvirring om vilken modifierare som har företräde. Om du vill markera specifika accessorer som readonly, ta bort modifieraren från egenskapsdeklarationen och placera den endast på accessorerna. Om alla accessorer ska vara readonlykan du också markera själva egenskapen i stället för enskilda accessorer.

Se till att både get och set accessorer är närvarande när du markerar enskilda accessorer som readonly (CS8664). Den här korrigeringen readonly är nödvändig eftersom modifieraren för enskilda åtkomster skiljer mellan åtkomster som ändrar tillstånd och de som inte gör det, vilket bara är meningsfullt när båda åtkomsttyperna finns. Om egenskapen bara har en get accessor markerar du hela egenskapen som readonly i stället för den enskilda accessorn.

Mer information finns i readonly-instansmedlemmar, init-nyckelord och Egenskaper.

Egenskapsinitialiseringar

  • CS8050: Endast automatiskt implementerade egenskaper, eller egenskaper som använder nyckelordet "fält", kan ha initialiserare
  • CS8051: Auto-implementerade egenskaper måste ha get-accessorer
  • CS8053: Instansegenskaper i gränssnitt kan inte ha initialiserare

Om du vill korrigera egenskapsinitieringsfel tillämpar du någon av följande ändringar baserat på den specifika diagnostiken:

Konvertera egenskapen till att använda automatisk implementerad syntax genom att ta bort åtkomstorganen och låta kompilatorn generera bakgrundsfältet (CS8050). Den här korrigeringen behövs eftersom endast egenskaper med kompilatorhanterad lagring kan ha initialiserare, vilket säkerställer att initieringen sker innan någon accessorlogik körs. Du kan också ändra implementeringarna för accessor så att nyckelordet field används för att komma åt det kompilatorsyntetiserade bakgrundsfältet. Den här metoden aktiverar initieraren samtidigt som anpassad accessorlogik upprätthålls. Om ingen av metoderna är lämplig tar du bort initieraren och tilldelar värdet i en konstruktor i stället, där du har fullständig kontroll över initieringssekvensen.

Lägg till en get accessor till den automatiskt implementerade egenskapen för att aktivera läsning av det initierade värdet (CS8051). Den här korrigeringen krävs eftersom initierare anger ett värde som måste kunna hämtas och en skrivskyddad egenskap strider mot den här grundläggande förväntan på initiering av egenskapen. Om du verkligen behöver en skrivskyddad egenskap implementerar du åtkomsterna explicit med ett bakgrundsfält och tilldelar fältet direkt i en konstruktor i stället för att använda en egenskapsinitierare.

Ta bort initieraren från gränssnittsegenskapsdeklarationer (CS8053). Den här korrigeringen är nödvändig eftersom gränssnitt definierar kontrakt för att implementera typer i stället för att tillhandahålla konkreta implementeringar med inledande värden. Om du behöver ange standardvärden implementerar du egenskapen i en klass som implementerar gränssnittet eller använder standardgränssnittsmetoder (finns i C# 8.0 och senare) för att tillhandahålla en standardimplementering.

Mer information finns i Egenskaper, Automatiskt implementerade egenskaper och fältnyckelord.

Obligatoriska medlemmar

  • CS9029: Typer och alias kan inte namnges "required".
  • CS9030: Medlemmen måste vara obligatorisk eftersom den åsidosätter nödvändig medlem.
  • CS9031: Obligatorisk medlem kan inte döljas av härledd medlem.
  • CS9032: Den obligatoriska medlemmen kan inte vara mindre synlig eller ha en setter som är mindre synlig än den innehållande typen.
  • CS9033: Använd inte .System.Runtime.CompilerServices.RequiredMemberAttribute' Använd nyckelordet "obligatoriskt" i obligatoriska fält och egenskaper i stället.
  • CS9034: Obligatorisk egenskap måste vara ändringsbar.
  • CS9035: Obligatorisk medlem måste anges i objektinitieraren eller attributkonstruktorn.
  • CS9036: Obligatorisk medlem "memberName" måste tilldelas ett värde, den kan inte använda en kapslad medlem eller samlingsinitierare.
  • CS9037: Listan över medlemmar som krävs är felaktigt formaterad och kan inte tolkas.
  • CS9038: Listan över medlemmar som krävs för bastypen är felaktig och kan inte tolkas. Använd attributet 'SetsRequiredMembers' om du vill använda den här konstruktorn.
  • CS9039: Den här konstruktorn måste lägga till 'SetsRequiredMembers' eftersom den kedjas till en konstruktor som har det attributet.
  • CS9040: Typen kan inte uppfylla villkoret förnew() parametern i den generiska typen eller metoden eftersom den har nödvändiga medlemmar.
  • CS9042: Obligatorisk medlem ska inte tillskrivas "ObsoleteAttribute" om inte den innehållande typen är föråldrad eller alla konstruktorer är föråldrade.
  • CS9045: Obligatoriska medlemmar tillåts inte på den översta nivån i ett skript eller en sändning.

Om du vill korrigera nödvändiga medlemsfel tillämpar du någon av följande ändringar baserat på den specifika diagnostiken:

Undvik att använda required som typ- eller aliasnamn (CS9029). Den här korrigeringen är nödvändig eftersom required är ett kontextuellt nyckelord i C# 11 och senare, och om du använder det som typnamn skapas tvetydighet i koden där nyckelordet kan visas.

Se till att härledda medlemmar bevarar required-modifieraren vid åsidosättande av obligatoriska medlemmar (CS9030). Den här korrigeringen tillämpar kontraktet som upprättats av basklassen, vilket garanterar att alla härledda typer har samma initieringskrav. Undvik att dölja nödvändiga medlemmar med icke-obligatoriska medlemmar i härledda klasser (CS9031), eftersom den här åtgärden bryter det initieringskontrakt som konsumenterna förväntar sig av bastypen.

Gör nödvändiga medlemmar minst lika synliga som deras innehållande typ och se till att egenskapssättarna också är tillräckligt synliga (CS9032). Den här korrigeringen förhindrar situationer där en typ är publikt tillgänglig, men dess nödvändiga medlemmar inte kan initieras från alla kontexter där typen instansieras.

Använd nyckelordet required i stället för att tillämpa RequiredMemberAttribute manuellt (CS9033). Den här korrigeringen säkerställer att kompilatorn genererar rätt metadata och framtvingar alla obligatoriska medlemsregler, vilket manuellt attributprogram kanske inte gör korrekt.

Se till att nödvändiga medlemmar har angett åtkomstorer eller på annat sätt kan ställas in (CS9034). Den här korrigeringen är nödvändig eftersom nödvändiga medlemmar måste initieras när objektet skapas, vilket kräver skrivåtkomst. När du skapar instanser initierar du nödvändiga medlemmar direkt i objektinitierare (CS9035, CS9036). Du måste tilldela ett värde till varje obligatorisk medlem i stället för att använda kapslade medlemsinitierare eller insamlingsinitiatorer, eftersom den obligatoriska medlemmen måste anges innan den får åtkomst till dess egenskaper.

Applicera SetsRequiredMembers-attributet på konstruktorer som initierar alla nödvändiga medlemmar i deras kroppar (CS9038, CS9039). Den här korrigeringen informerar kompilatorn om att konstruktorn uppfyller det nödvändiga medlemskontraktet, vilket gör det möjligt att skapa objekt utan objektinitierare. Om en konstruktor kedjar till en annan konstruktor med SetsRequiredMembersmåste den också ha attributet .

Undvik att använda nödvändiga medlemmar i typer som måste uppfylla villkoret new() (CS9040), eftersom den parameterlösa konstruktorn inte kan garantera nödvändig medlemsinitiering utan en objektinitierare. Markera inte obligatoriska element som föråldrade om inte den innehållande typen eller alla konstruktorer är föråldrade (CS9042), för att undvika situationer där element krävs men deras användning avråds. Obligatoriska medlemmar tillåts inte i toppnivåinstruktioner eller skriptkontexter (CS9045) eftersom dessa kontexter inte stöder den initieringssyntax för objekt som krävs för att ange nödvändiga medlemmar.

Mer information finns i den nödvändiga referensartikeln för modifierare och guiden Initierare för objekt och samling .

Egenskaper som returnerar referenser

  • CS8145: Auto-implementerade egenskaper kan inte returneras med referens
  • CS8147: Egenskaper som returneras med referens kan inte ha angett åtkomst

Om du vill korrigera referensreturnerande egenskapsfel tillämpar du någon av följande ändringar baserat på den specifika diagnosen:

Implementera egenskapen explicit med ett bakgrundsfält och använd nyckelordet ref i get accessorns returuttryck (CS8145). Den här korrigeringen är nödvändig eftersom automatiskt implementerade egenskaper genererar ett privat bakgrundsfält som kompilatorn hanterar internt. Om du returnerar en referens till ett privat fält exponeras intern lagring som anropare inte ska komma åt direkt. Om man vill skapa en egenskap som returnerar referens, returnerar man det med => ref backingField-syntax genom att deklarera ett explicit fält. Om du inte behöver returnera en referens för att tillåta direkt ändring av lagringen kan du också ta bort ref modifieraren från egenskapsdeklarationen.

Ta bort set accessorn från egenskaper som returnerar referenser (CS8147). Den här korrigeringen krävs eftersom en referensreturegenskap redan ger både läs- och skrivåtkomst via själva den returnerade referensen. Anropare kan direkt ändra värdet via referensen utan att behöva en separat setter-metod. Att inkludera en set accessor skulle skapa två olika mekanismer för att ändra samma lagring, som är redundant och kan leda till förvirring om vilken ändringssökväg som ska användas.

Mer information finns i referensreturer och referenslokalinställningar och egenskaper.