Błędy i ostrzeżenia związane z deklaracjami właściwości

Mogą wystąpić następujące błędy związane z deklaracjami właściwości:

  • CS0200: Nie można przypisać właściwości lub indeksatora "właściwość" do — jest tylko do odczytu
  • CS0273: Modyfikator dostępu akcesora musi być bardziej restrykcyjny niż właściwość lub indeksator
  • CS0274: Nie można określić modyfikatorów dostępu dla obu akcesorów właściwości lub indeksatora 'właściwość'
  • CS0275: "akcesor": modyfikatory dostępu nie mogą być używane w akcesorach w interfejsie
  • CS0276: 'właściwość': modyfikatory dostępu dla akcesorów mogą być używane tylko wtedy, gdy właściwość lub indeksator ma zarówno akcesor get, jak i akcesor set
  • CS0442: "właściwość": właściwości abstrakcyjne nie mogą mieć prywatnych metod dostępu
  • CS0544: "property": nie można zastąpić, ponieważ właściwość "member" nie jest właściwością
  • CS0545: "function" : nie można zastąpić, ponieważ property nie ma zastępowalnego akcesora get
  • CS0546: 'akcesor': nie można zastąpić, ponieważ właściwość nie ma nadpisywalnego akcesora set
  • CS0547: 'właściwość': właściwość lub indeksator nie może mieć typu void
  • CS0548: "właściwość": właściwość lub indeksator musi mieć co najmniej jedną metodę dostępu
  • CS0571: "function" : nie można jawnie wywołać operatora lub akcesora
  • CS0610: Pole lub właściwość nie może być typu "type"
  • CS0840: "Nazwa właściwości" musi zadeklarować ciało, ponieważ nie jest oznaczona jako abstrakcyjna ani extern. Automatycznie zaimplementowane właściwości muszą definiować zarówno akcesory get, jak i set.
  • CS1014: Oczekiwano akcesora pobierającego lub ustawiającego
  • CS1043: { lub ; oczekiwano
  • CS1715: "type": typ musi być "type", aby dopasować zastąpiony element członkowski "member"
  • CS8050: Tylko właściwości implementowane automatycznie lub właściwości używające słowa kluczowego "field" mogą mieć inicjatory.
  • CS8051: Właściwości zaimplementowane automatycznie muszą mieć akcesory typu get.
  • CS8053: Właściwości wystąpienia w interfejsach nie mogą mieć inicjalizatorów.
  • CS8080: Automatycznie implementowane właściwości muszą zastąpić wszystkie akcesory przesłoniętej właściwości.
  • CS8145: Właściwości zaimplementowane automatycznie nie mogą być zwracane przez odwołanie
  • CS8147: Właściwości zwracane przez odwołanie nie mogą mieć ustawionych metod dostępu
  • CS8341: Właściwości wystąpienia implementowane automatycznie w strukturach tylko do odczytu muszą być tylko do odczytu.
  • CS8657: Statyczny element członkowski "member" nie może być oznaczony jako "readonly".
  • CS8658: Automatycznie zaimplementowany akcesor 'set' nie może być oznaczony jako 'readonly'.
  • CS8659: Automatycznie implementowana właściwość "property" nie może być oznaczona jako "readonly", ponieważ ma akcesor 'set'.
  • CS8660: Nie można określić modyfikatorów "readonly" zarówno dla właściwości lub indeksatora "property", jak i jego metody dostępu. Usuń jeden z nich.
  • pl-PL: CS8661: Nie można określić modyfikatorów "readonly" dla obu akcesorów właściwości lub indeksatora 'property'. Zamiast tego należy umieścić modyfikator "readonly" na samej właściwości.
  • CS8664: "właściwość": "readonly" można używać tylko na akcesorach, jeśli właściwość lub indeksator ma zarówno akcesor get, jak i akcesor set
  • CS8852: Właściwość init-only lub indeksator 'property' można przypisać wyłącznie w inicjatorze obiektu albo w 'this' lub 'base' w konstruktorze instancji bądź w akcesorze 'init'.
  • CS8853: element członkowski musi być zgodny tylko z init przesłoniętego elementu członkowskiego "member"
  • CS8855: Akcesory 'accessor' i 'accessor' powinny być albo init-only, albo żaden z nich
  • CS8856: Akcesorium "init" jest nieprawidłowe dla statycznych elementów członkowskich
  • CS8903: Akcesory 'init' nie mogą być oznaczone jako 'readonly'. Zamiast tego oznacz właściwość jako 'readonly'.
  • CS9029: Typy i aliasy nie mogą mieć nazwy "required".
  • CS9030: "member" musi być oznaczony jako wymagany, ponieważ zastępuje wymagany element "member"
  • CS9031: Wymagany element członkowski "członek" nie może być ukryty przez "członka".
  • CS9032: Wymagany członek nie może być mniej widoczny ani mieć ustawiania mniej widocznego niż typ nadrzędny.
  • CS9033: Nie używaj "System.Runtime.CompilerServices.RequiredMemberAttribute'. Zamiast tego użyj słowa kluczowego "required" dla wymaganych pól i właściwości.
  • CS9034: Wymagany członek musi być możliwy do ustawienia.
  • CS9035: Wymagany element członkowski musi być ustawiony w inicjatorze obiektu lub konstruktorze atrybutu.
  • CS9036: Wymagany element członkowski "memberName" musi mieć przypisaną wartość, nie może użyć zagnieżdżonego elementu członkowskiego lub inicjatora kolekcji.
  • CS9037: Lista wymaganych członków dla "typu" jest źle sformułowana i nie można jej zinterpretować.
  • CS9038: Lista wymaganych elementów członkowskich typu podstawowego "type" jest źle sformułowana i nie można jej zinterpretować. Aby użyć tego konstruktora, zastosuj atrybut "SetsRequiredMembers".
  • CS9039: Ten konstruktor musi dodać 'SetsRequiredMembers', ponieważ odwołuje się do konstruktora, który ma ten atrybut.
  • CS9040: Typ nie może spełnić ograniczenia "new()" dla parametru w typie ogólnym lub metodzie, ponieważ ma wymagane elementy członkowskie.
  • CS9042: Wymagany członek nie powinien być przypisywany atrybutem "ObsoleteAttribute", chyba że typ zawierający jest przestarzały lub wszystkie konstruktory są przestarzałe.
  • CS9045: Wymagani członkowie nie są dozwoleni na najwyższym poziomie skryptu ani w przesyłanym pliku.
  • CS9258: W tej wersji języka słowo kluczowe "field" wiąże się z syntetyzowanym polem zapasowym dla właściwości. Aby uniknąć generowania zsyntetyzowanego pola zapasowego i odwołać się do istniejącego elementu członkowskiego, zamiast tego użyj "this.field" lub "@field".
  • CS9263: Właściwość częściowa nie może mieć inicjatora zarówno definicji, jak i implementacji.

Dla właściwości opartych na polach można wygenerować następujące ostrzeżenia:

  • CS9264: Właściwość nieakceptująca wartości null "property" musi zawierać wartość inną niż null podczas zamykania konstruktora. Rozważ dodanie modyfikatora "wymagane", zadeklarowanie właściwości jako akceptującej wartości null lub bezpieczne obsługiwanie przypadku, w którym element "field" ma wartość null w akcesorze "get".
  • CS9266: Akcesorium właściwości "property" powinno używać "field", ponieważ inne akcesorium używa go.
  • CS9273: W tej wersji językowej "field" stanowi słowo kluczowe wewnątrz akcesora właściwości. Zmień nazwę zmiennej lub użyj identyfikatora "@field" zamiast tego.

W poniższych sekcjach opisano przyczynę i poprawki tych błędów i ostrzeżeń.

Dostępność akcesora

  • CS0273: Modyfikator dostępności akcesora musi być bardziej ograniczający niż właściwość lub indeksator 'property'.
  • CS0274: Nie można określić modyfikatorów dostępu dla obu akcesorów właściwości lub indeksatora 'property'
  • CS0275: 'akcesor': modyfikatory dostępu nie mogą być używane w akcesorach w interfejsie
  • CS0276: "właściwość": modyfikatory dostępu dla akcesorów mogą być używane tylko wtedy, gdy właściwość lub indeksator ma zarówno akcesor get, jak i akcesor set
  • CS0442: "właściwość": właściwości abstrakcyjne nie mogą mieć prywatnych metod dostępu

Te błędy wymuszają reguły modyfikatorów dostępu dla właściwości i metod dostępu indeksatora. Aby zapoznać się z pełnymi regułami, zobacz Ograniczanie dostępności akcesorów oraz Akcesory w specyfikacji języka C#. Aby naprawić te błędy, zastosuj jedną z następujących zmian na podstawie określonej diagnostyki:

  • Użyj modyfikatora dostępu, który jest bardziej restrykcyjny niż zadeklarowana dostępność właściwości (CS0273). Na przykład internal właściwość może mieć metodę dostępu private, ale nie metodę dostępu public. Dostępność akcesora musi być odpowiednim podzbiorem dostępności właściwości.
  • Zastosuj modyfikator dostępu tylko do jednego z dwóch metod dostępu (CS0274). Deklaracja właściwości określa domyślny poziom dostępu dla obu akcesorów, a tylko jeden akcesor może różnić się od tego domyślnego. Umieść modyfikator dostępu w zależności od tego, który akcesor wymaga ograniczonego dostępu.
  • Usuń modyfikatory dostępu z metod dostępu w deklaracjach właściwości interfejsu (CS0275). Członkowie interfejsu definiują publiczny kontrakt, a modyfikatory dostępu dla poszczególnych akcesorów nie są dozwolone. Jeśli musisz ograniczyć dostęp, zastosuj ograniczenie w klasie implementowania.
  • Dodaj zarówno metodę dostępową get, jak i set do właściwości, zanim zastosujesz modyfikator dostępu do którejkolwiek z nich (CS0276). Modyfikatory dostępu w akcesorach odróżniają widoczność jednego akcesora od drugiego, co wymaga obecności obu akcesorów. Jeśli właściwość ma tylko jedną metodę dostępu, usuń z niej modyfikator dostępu.
  • Zmień modyfikator dostępu dla metod dostępu abstrakcyjnych z private na mniej restrykcyjny modyfikator (CS0442). Składowe abstrakcyjne muszą być dostępne dla klas pochodnych, aby te klasy mogły zapewnić implementacje. Użyj wartości protected, internallub protected internal zamiast private.

Aby uzyskać więcej informacji, zobacz Ograniczanie dostępności akcesorów oraz Właściwości.

Składnia deklaracji właściwości

  • CS0547: właściwość lub indeksator nie mogą mieć typu void
  • CS0548: "właściwość": właściwość lub indeksator musi mieć co najmniej jedną metodę dostępu
  • CS0571: "function" : nie można jawnie wywołać operatora lub akcesora
  • CS0610: Pole lub właściwość nie może być typu "type"
  • CS0840: "Nazwa właściwości" musi zadeklarować ciało, ponieważ nie jest oznaczona jako 'abstract' ani 'extern'. Automatycznie zaimplementowane właściwości muszą definiować zarówno akcesory get, jak i set.
  • CS1014: Oczekiwano akcesora get lub set
  • CS1043: { lub ; oczekiwano

Te błędy wymuszają wymagania strukturalne deklaracji właściwości i indeksatora. Aby uzyskać pełne reguły, zobacz właściwości i sekcję Właściwości specyfikacji języka C#. Aby naprawić te błędy, zastosuj jedną z następujących zmian na podstawie określonej diagnostyki:

  • Zmień typ właściwości z void na prawidłowy typ (CS0547). Właściwości i indeksatory reprezentują wyrażenia i void nie są prawidłowym typem wyrażenia. Wybierz odpowiedni typ danych reprezentowanych przez właściwość.
  • Dodaj co najmniej jedną metodę dostępu (get, setlub init) do deklaracji właściwości (CS0548). Właściwość bez żadnych metod dostępu nie ma sposobu odczytywania ani zapisywania jego wartości. Uwzględnij akcesor get, akcesor set lub init, albo oba akcesory.
  • Uzyskiwanie dostępu do właściwości przy użyciu składni właściwości zamiast bezpośredniego wywoływania metod dostępu (CS0571). Metody dostępu właściwości kompilują się do metod o nazwach get_PropertyName i set_PropertyName, ale wywołują te metody za pomocą składni właściwości (obj.Property i obj.Property = value). Ta sama zasada dotyczy operatorów. Użyj składni operatora (++obj) zamiast wywoływania metod, takich jak op_Increment.
  • Zmień typ pola lub właściwości z typu ograniczonego na dozwolony typ (CS0610). Niektóre typy, takie jak TypedReference i ArgIterator nie mogą być używane jako pola lub właściwości. Te typy mogą być nadal używane jako parametry metody lub zmienne lokalne.
  • W przypadku właściwości tylko do odczytu zadeklaruj automatycznie implementowaną właściwość tylko do odczytu get. W przeciwnym razie dodaj zarówno metody dostępu, jak get i set do deklaracji właściwości implementowanych automatycznie lub podaj jawne jednostki dostępu (CS0840). W przypadku właściwości wymagającej logiki niestandardowej użyj słowa kluczowego field, dodanego w wersji C# 13, w celu uzyskania dostępu do polu zapasowemu wygenerowanemu przez kompilator w ciele akcesora. W przypadku właściwości abstract lub extern usuń ciała akcesorów, ponieważ implementacja jest udostępniana gdzie indziej. W przypadku partial właściwości podziel deklarację i implementację między deklaracje typu częściowego.
  • Upewnij się, że treść właściwości zawiera tylko prawidłowe słowa kluczowe metody dostępu —get , setlub init (CS1014). Ciała właściwości nie mogą zawierać arbitralnych instrukcji ani deklaracji elementów składowych. Przenieś pola i metody z właściwości do ciała klasy lub struktury.
  • Użyj prawidłowej składni metody dostępu właściwości z nawiasami klamrowymi lub ciałami wyrażeń (CS1043). Jednostki dostępu muszą używać nawiasów klamrowych { }, metody dostępu wyrażeń muszą używać => składni, a właściwości implementowane automatycznie muszą kończyć się średnikiem po tokenie dostępu.

Aby uzyskać więcej informacji, zobacz Właściwości, Właściwości zaimplementowane automatycznie i Używanie właściwości.

Przesłonięcia właściwości

  • CS0544: "property": nie można zastąpić, ponieważ właściwość "member" nie jest właściwością
  • CS0545: "function" : nie można zastąpić, ponieważ właściwość nie ma zastępowalnej metody uzyskiwania dostępu
  • CS0546: "akcesorium": nie można zastąpić, ponieważ właściwość nie ma przesłonięć zestawu dostępu
  • CS1715: "type": typ musi być "type", aby dopasować zastąpiony element członkowski "member"
  • CS8080: Właściwości implementowane automatycznie muszą zastąpić wszystkie metody dostępu właściwości przesłoniętej.

Te błędy wymuszają reguły zastępowania właściwości w klasach pochodnych. Aby zapoznać się z pełnymi regułami, zobacz sekcję Dziedziczenie i Wirtualne, zapieczętowane, zastępowane i abstrakcyjne metody dostępu specyfikacji języka C#. Aby naprawić te błędy, zastosuj jedną z następujących zmian na podstawie określonej diagnostyki:

  • Upewnij się, że zastępowany element członkowski jest właściwością, a nie polem lub metodą (CS0544). Słowo kluczowe override dla właściwości może dotyczyć tylko właściwości virtual, abstract lub override w klasie bazowej. Aby zasłonić składową niebędącą właściwością za pomocą właściwości, użyj słowa kluczowego new zamiast override.
  • Zastąp tylko metody dostępu istniejące w deklaracji właściwości klasy bazowej (CS0545, CS0546). Nie można przesłonić akcesora właściwości, która nie jest obecna ani dostępna w klasie bazowej, ponieważ nie ma wirtualnej metody do przesłonięcia. Jeśli właściwość klasy bazowej ma tylko akcesor get, nie można dodać akcesora set za pośrednictwem przesłonięcia. Dodaj brakujący akcesor do klasy bazowej i oznacz ją virtual, lub użyj new, aby ukryć właściwość klasy bazowej nową definicją właściwości.
  • Dopasuj typ właściwości zastępowania do typu zastępowanego elementu członkowskiego (CS1715). Właściwości tylko do odczytu (gettylko do odczytu) obsługują kowariantne typy zwracane począwszy od języka C# 9, więc przesłonięcia mogą zwracać bardziej pochodny typ. Jednak właściwości, które mają akcesor set lub init, wymagają dokładnego dopasowania typu, ponieważ setter akceptuje wartości zadeklarowanego typu. Jeśli potrzebujesz innego typu we właściwości z metodą ustawiającą, zmień typ właściwości w klasie pochodnej, aby odpowiadał typowi w deklaracji klasy bazowej, albo usuń metodę ustawiającą i użyj zamiast tego kowariantnego typu zwracanego.
  • Uwzględnij wszystkie akcesory z właściwości bazowej podczas zastępowania ich automatycznie implementowaną właściwością (CS8080). Automatycznie zaimplementowane właściwości generują implementacje pamięci i akcesorów, dlatego muszą przesłonić wszystkie akcesory obecne w klasie bazowej. Jeśli właściwość podstawowa ma zarówno get, jak i set, automatycznie zaimplementowane przesłonięcie musi również zawierać oba. Aby zastąpić tylko określone metody dostępu, zaimplementuj właściwość z jawnymi ciałami dostępu i jawnym polem pomocniczym zamiast używać automatycznej implementacji.

Aby uzyskać więcej informacji, zobacz Dziedziczenie, Właściwości i Używanie właściwości.

Właściwości oparte na polach

  • CS9258: W tej wersji języka słowo kluczowe "field" wiąże się z syntetyzowanym polem zapasowym dla właściwości. Aby uniknąć generowania zsyntetyzowanego pola zapasowego i odwołać się do istniejącego elementu członkowskiego, zamiast tego użyj "this.field" lub "@field".
  • CS9263: Właściwość częściowa nie może mieć inicjatora zarówno definicji, jak i implementacji.
  • CS9264: Nienullowalna właściwość "property" musi zawierać wartość inną niż null przy wychodzeniu z konstruktora. Rozważ dodanie modyfikatora 'required', zadeklarowanie właściwości jako dopuszczającej wartość null, lub bezpieczne obsłużenie przypadku, w którym "field" ma wartość null w metodzie dostępu "get".
  • CS9266: Akcesor właściwości „property” powinien używać „field”, ponieważ drugi akcesor korzysta z niego.
  • CS9273: W tej wersji językowej "field" jest słowem kluczowym w metodzie dostępu do właściwości. Zmień nazwę zmiennej lub użyj identyfikatora "@field".

Aby poprawić błędy właściwości wspieranych polami, zastosuj jedną z następujących zmian na podstawie określonej diagnozy:

  • Zmień nazwę dowolnej zmiennej o nazwie field na inny identyfikator lub użyj @field składni ucieczki, aby odwołać się do zmiennej (CS9258, CS9273). Ta korekta jest niezbędna, ponieważ field jest kontekstowym słowem kluczowym w akcesorach właściwości w języku C# 13 i nowszych wersjach, gdzie odwołuje się do pola wspierającego syntetyzowanego przez kompilator. Jeśli chcesz uzyskać dostęp do istniejącego elementu członkowskiego o nazwie field zamiast zsyntetyzowanego pola zapasowego, użyj this.field , aby dookreślić odwołanie.
  • Usuń inicjator z częściowej definicji właściwości lub implementacji, zachowując tylko jeden element (CS9263). Ta korekta jest wymagana, ponieważ zezwolenie na inicjatory w obu lokalizacjach prowadziłoby do niejasności co do tego, która wartość powinna zostać użyta i może prowadzić do zainicjowania pola pomocniczego dwa razy z potencjalnie różnymi wartościami.
  • [field: MaybeNull, AllowNull] Dodaj atrybuty do deklaracji właściwości, aby wskazać, że pole zapasowe powinno być traktowane jako dopuszczające wartość null (CS9264). Ta korekta dostosowuje oczekiwania dotyczące możliwości przypisania wartości null między typem właściwości a polu wspierającym generowanym przez kompilator, rozwiązując niezgodność, w której właściwość jest zadeklarowana jako nieprzyjmująca wartości null, ale użycie słowa kluczowego field sugeruje, że może to być wartość null. Alternatywnie zmień typ właściwości na nullable, dodaj modyfikator required aby zapewnić inicjalizację lub zainicjalizuj właściwość w konstruktorze.
  • Konsekwentnie należy stosować słowo kluczowe field w obu akcesorach lub stosować jawne pole pomocnicze w obu akcesorach (CS9266). Ta korekta zapobiega potencjalnym usterce, gdy jeden element dostępu modyfikuje pole kopii zapasowej syntetyzowane przez kompilator, podczas gdy inne metody dostępu modyfikują inną lokalizację przechowywania, co prowadzi do niespójnego zachowania właściwości.

Aby uzyskać więcej informacji, zobacz pole kluczowe i właściwości częściowe.

Właściwości tylko do odczytu

  • CS0200: Nie można przypisać do właściwości lub indeksatora "właściwość" — ponieważ jest tylko do odczytu
  • CS8341: Właściwości wystąpienia implementowane automatycznie w strukturach oznaczonych jako tylko do odczytu muszą mieć właściwość tylko do odczytu.
  • CS8657: Statyczny członek "member" nie może być oznakowany jako "readonly".
  • CS8658: Automatycznie zaimplementowanego akcesora 'set' nie można oznaczyć jako 'readonly'.
  • CS8659: Właściwość "property" zaimplementowana automatycznie nie może być oznaczona jako "readonly", ponieważ ma metodę dostępu "set".
  • CS8660: Nie można określić modyfikatorów "readonly" zarówno dla właściwości "property", jak i jej akcesora. Usuń jeden z nich.
  • CS8661: Nie można określić modyfikatorów "readonly" dla obu akcesorów właściwości lub indeksatora "właściwości". Zamiast tego należy umieścić modyfikator "readonly" bezpośrednio na właściwość.
  • CS8664: "właściwość": "readonly" można używać tylko na akcesorach, jeśli właściwość lub indeksator ma zarówno metodę get, jak i zestaw akcesoriów

Aby poprawić błędy właściwości tylko do odczytu, zastosuj jedną z następujących zmian w oparciu o określoną diagnozę:

  • Dodaj set lub init metodę dostępu do właściwości, aby można było ją zapisywać (CS0200). Ta korekta jest niezbędna, ponieważ właściwości bez zestawów metod dostępu są tylko do odczytu i mogą być przypisane tylko w konstruktorze lub inicjatorze pola deklarowanego typu. Jeśli chcesz ustawić właściwość podczas inicjowania jego obiektu, ale aby była niezmienialna później, użyj init akcesora zamiast set akcesora. Jeśli właściwość powinna pozostać tylko do odczytu, przenieś przypisanie do konstruktora, w którym jest dozwolone inicjowanie, lub ponownie sprawdź, czy przypisanie jest konieczne w ogóle.
  • Oznacz automatycznie implementowane właściwości wystąpienia jako readonly podczas deklarowania ich wewnątrz readonly struct (CS8341). Ta poprawka wymusza zasadę niezmienności dla struktury, zapewniając, że wszyscy członkowie instancji przestrzegają gwarancji readonly. Jeśli właściwość musi być modyfikowalna, usuń modyfikator readonly z deklaracji struktury lub zaimplementuj właściwość przy użyciu jawnego pola pomocniczego oraz ciał akcesorów, które nie modyfikują stanu wystąpienia.
  • readonly Usuń modyfikator z deklaracji właściwości statycznych lub metod dostępu (CS8657). Ta korekta jest wymagana, ponieważ modyfikator readonly ma zastosowanie tylko do elementów członkowskich instancji struktur, aby wskazać, że nie zmieniają one stanu instancji, a statyczne elementy członkowskie nie mają stanu instancji do ochrony. Jeśli potrzebujesz statycznej właściwości tylko do odczytu, po prostu pomiń akcesor set zamiast stosować modyfikator readonly.
  • Usuń modyfikator readonly z automatycznie zaimplementowanych akcesorów set lub zastosuj go tylko do akcesora get (CS8658). Ta korekta jest niezbędna, ponieważ set metody dostępu z natury modyfikują stan, który jest sprzeczny z celem readonly modyfikatora, który gwarantuje brak modyfikacji stanu wystąpienia. Jeśli potrzebujesz właściwości, którą można ustawić podczas inicjowania, ale później jest tylko do odczytu, użyj akcesora init zamiast akcesora set.
  • readonly Usuń ten modyfikator z deklaracji właściwości, gdy właściwość ma akcesor set (CS8659). Poprawka ta jest wymagana, ponieważ właściwości z set akcesorami mogą modyfikować stan instancji, co narusza readonly gwarancję. Jeśli potrzebujesz ustawienia wyłącznie podczas inicjalizacji, zastąp akcesor set akcesorem init lub całkowicie usuń akcesor set, aby właściwość była naprawdę tylko do odczytu.
  • Umieść modyfikator readonly na deklaracji właściwości lub na poszczególnych akcesorach, ale nie na obu (CS8660, CS8661). Ta korekta uniemożliwia nadmiarowe deklaracje modyfikatora, które mogą powodować zamieszanie dotyczące tego, który modyfikator ma pierwszeństwo. Jeśli chcesz oznaczyć określone akcesory jako readonly, usuń modyfikator z deklaracji właściwości i dodaj go tylko do akcesorów. Alternatywnie, jeśli wszystkie metody dostępu powinny mieć readonly, ustaw samą właściwość zamiast poszczególnych metod dostępowych.
  • Upewnij się, że zarówno akcesory get, jak i set są obecne podczas zaznaczania poszczególnych akcesoriów jako readonly (CS8664). Ta korekta jest konieczna, ponieważ readonly modyfikator poszczególnych metod dostępu rozróżnia metody dostępu modyfikujące stan i te, które nie, co ma sens tylko wtedy, gdy istnieją oba typy akcesoriów. Jeśli właściwość ma tylko get akcesor, oznacz całą właściwość jako readonly zamiast get akcesora.

Aby uzyskać więcej informacji, zobacz readonly instance members, init słowo kluczowe i Właściwości.

Właściwości dostępne tylko przy inicjalizacji

  • CS8852: Właściwość tylko do inicjacji lub indeksator "property" można przypisać tylko w inicjatorze obiektu, albo poprzez 'this' lub 'base' w konstruktorze instancji, albo w akcesorze 'init'.
  • CS8853: element członkowski musi być zgodny tylko z init przesłoniętego elementu członkowskiego "member"
  • CS8855: Akcesory 'accessor' i 'accessor' powinny być albo oba typu init-only, albo żaden z nich
  • CS8856: Akcesorium "init" jest nieprawidłowe dla statycznych składowych
  • CS8903: metody dostępu 'init' nie mogą być oznaczone jako 'readonly'. Zamiast tego oznacz 'właściwość' jako 'readonly'.

Te błędy wymuszają reguły dla akcesora init, co umożliwia niezmienne inicjowanie obiektu. Aby zapoznać się z pełnymi regułami, zobacz słowo kluczowe init. Aby naprawić te błędy, zastosuj jedną z następujących zmian na podstawie określonej diagnostyki:

  • Przenieś przypisania do właściwości init-only do inicjatora obiektu, konstruktora lub init akcesora (CS8852). Nie można przypisywać właściwości tylko do inicjowania po zakończeniu budowy obiektu. Przypisz wartość w treści konstruktora, akcesorze init lub wyrażeniu inicjatora obiektu (new MyType { Property = value }). Jeśli musisz przypisać nieruchomość po budowie, zmień init akcesorium na set akcesorium.
  • Dopasuj init lub set rodzaj akcesora przy zastępowaniu właściwości (CS8853). Jeśli właściwość klasy bazowej używa metody dostępu init, zastępująca właściwość musi również używać metody dostępu init. Podobnie, jeśli baza używa set, przesłonięcie musi używać set. Ta spójność gwarantuje, że kontrakt niezmienności ustanowiony przez typ podstawowy jest zachowywany w typach pochodnych.
  • Użyj tego samego typu akcesora (init lub set) dla obydwu akcesorów w jawnej implementacji interfejsu (CS8855). Gdy typ jawnie implementuje dwa interfejsy, które deklarują tę samą właściwość, obie implementacje akcessorów muszą być zgodne: albo oba używają init, albo oba używają set.
  • Usuń akcesor init z deklaracji właściwości statycznych lub zmień go na akcesor set (CS8856). Akcesor init jest zaprojektowany pod kątem wzorców inicjalizacji wystąpień związanych z tworzeniem obiektu, a statyczne członki nie uczestniczą w inicjalizacji obiektów. Użyj akcesora dla właściwości statycznych, które można modyfikować, lub usuń setter całkowicie dla właściwości statycznych tylko do odczytu.
  • Usuń modyfikator readonly z akcesora init (CS8903). Modyfikator readonly pola struktury gwarantuje, że pole nie zmieni wystąpienia struktury. Ponieważ metoda dostępu init przypisuje stan wystąpienia, z natury zmienia strukturę i nie może być oznaczona jako readonly. Aby ustawić akcesor getreadonly, zastosuj modyfikator readonly tylko do akcesora get.

Aby uzyskać więcej informacji, zobacz słowo kluczowe init oraz Inicjatory obiektów i kolekcji.

Inicjatory właściwości

  • CS8050: Tylko właściwości implementowane automatycznie lub właściwości używające słowa kluczowego "field" mogą mieć inicjatory.
  • CS8051: Właściwości zaimplementowane automatycznie muszą mieć metody dostępu typu get.
  • CS8053: Właściwości wystąpienia w interfejsach nie mogą mieć inicjalizatorów.

Aby poprawić błędy inicjatora właściwości, zastosuj jedną z następujących zmian na podstawie określonej diagnostyki:

  • Przekonwertuj właściwość, aby używać składni automatycznie implementowanej, usuwając ciała akcesorów i pozwalając kompilatorowi wygenerować pole zapasowe (CS8050). Ta poprawka jest wymagana, ponieważ tylko właściwości z zarządzanym przez kompilator przechowywaniem mogą mieć inicjalizatory, zapewniając, że inicjowanie ma miejsce przed uruchomieniem jakiejkolwiek logiki dostępowej. Alternatywnie, zmodyfikuj implementacje akcesorów, aby użyć słowa kluczowego field w celu uzyskania dostępu do pola pomocniczego syntetyzowanego przez kompilator. Takie podejście umożliwia użycie inicjalizatora przy zachowaniu niestandardowej logiki dostępu. Jeśli żadna z metod nie jest odpowiednia, usuń inicjator i przypisz wartość w konstruktorze, gdzie masz pełną kontrolę nad sekwencją inicjowania.
  • Dodaj akcesor get do automatycznie implementowanej właściwości, aby umożliwić odczytywanie zainicjowanej wartości (CS8051). Ta korekta jest wymagana, ponieważ inicjatory ustawiają wartość, która musi być możliwa do odczytu, a właściwość tylko do zapisu narusza to podstawowe oczekiwanie inicjacji właściwości. Jeśli naprawdę potrzebujesz właściwości tylko do zapisu, zaimplementuj jawnie metody dostępu z polem zapasowym i przypisz pole bezpośrednio w konstruktorze zamiast używać inicjatora właściwości.
  • Usuń inicjator z deklaracji właściwości interfejsu (CS8053). Ta korekta jest niezbędna, ponieważ interfejsy definiują kontrakty na potrzeby implementowania typów, zamiast dostarczać konkretne implementacje z wartościami początkowymi. Jeśli musisz podać wartości domyślne, zaimplementuj właściwość w klasie, która implementuje interfejs, lub użyj domyślnych metod interfejsu (dostępnych w języku C# 8.0 i nowszych), aby podać domyślną implementację.

Aby uzyskać więcej informacji, zobacz Właściwości, Właściwości zaimplementowane automatycznie i słowo kluczowe pola.

Wymagani członkowie

  • CS9029: Typy i aliasy nie mogą mieć nazwy "required".
  • CS9030: "członek" musi być wymagany, ponieważ zastępuje wymagany element członkowski "członek"
  • CS9031: Wymagany element 'element' nie może być ukryty przez 'element'.
  • CS9032: Wymagany członek nie może mieć niższej widoczności ani mieć ustawiającego o niższej widoczności niż typ, który go zawiera.
  • CS9033: Nie używaj "System.Runtime.CompilerServices.RequiredMemberAttribute'. Zamiast tego użyj słowa kluczowego "required" dla wymaganych pól i właściwości.
  • CS9034: Wymagany członek musi być możliwy do ustawienia.
  • CS9035: Wymagany członek musi być ustawiony w inicjatorze obiektu lub konstruktorze dla atrybutu.
  • CS9036: Wymagany element członkowski "memberName" musi mieć przypisaną wartość, nie może użyć zagnieżdżonego elementu członkowskiego lub inicjatora kolekcji.
  • CS9037: Lista wymaganych członków dla "typu" jest źle sformułowana i jej nie można zinterpretować.
  • CS9038: Lista wymaganych elementów członkowskich typu podstawowego "type" jest źle sformułowana i nie można jej zinterpretować. Aby użyć tego konstruktora, zastosuj atrybut "SetsRequiredMembers".
  • CS9039: Ten konstruktor musi dodać element "SetsRequiredMembers", ponieważ odwołuje się do konstruktora, który ma ten atrybut.
  • CS9040: Typ nie może spełnić ograniczenia "new()" dla parametru w typie ogólnym lub metodzie, ponieważ ma wymagane elementy członkowskie.
  • CS9042: Wymagany członek nie powinien być oznaczony jako "ObsoleteAttribute", chyba że typ zawierający jest przestarzały lub wszystkie konstruktory są przestarzałe.
  • CS9045: Wymagani członkowie nie są dozwoleni na najwyższym poziomie skryptu lub przesyłania.

Aby poprawić błędy dotyczące wymaganego elementu, zastosuj jedną z następujących zmian zgodnie z konkretną diagnozą.

  • Unikaj używania required jako nazwy typu lub aliasu (CS9029). Ta korekta jest niezbędna, ponieważ required jest kontekstowym słowem kluczowym w języku C# 11 i nowszym, a użycie go jako nazwy typu powoduje niejednoznaczność w kodzie, w którym może pojawić się słowo kluczowe.
  • Upewnij się, że pochodne elementy członkowskie utrzymują required modyfikator podczas zastępowania wymaganych elementów członkowskich (CS9030). Ta korekta wymusza kontrakt ustanowiony przez klasę bazową, gwarantując, że wszystkie typy pochodne zachowują te same wymagania inicjowania. Unikaj ukrywania wymaganych członków członkami niewymaganymi w klasach pochodnych (CS9031), ponieważ takie działanie narusza kontrakt inicjowania, którego użytkownicy oczekują dla typu bazowego.
  • Ustaw wymagane elementy członkowskie co najmniej tak widoczne, jak ich typ zawierający, i upewnij się, że zestawy właściwości są również wystarczająco widoczne (CS9032). Ta korekta zapobiega sytuacjom, w których typ jest publicznie dostępny, ale jego wymagane elementy członkowskie nie mogą być inicjowane ze wszystkich kontekstów, w których typ jest konstruowany.
  • required Użyj słowa kluczowego zamiast ręcznego stosowania RequiredMemberAttribute (CS9033). Ta korekta gwarantuje, że kompilator generuje poprawne metadane i wymusza wszystkie wymagane reguły składowe, których aplikacja atrybutów ręcznych może nie wykonywać poprawnie.
  • Upewnij się, że wymagane elementy członkowskie mają ustawione metody dostępu lub są w inny sposób konfigurowalne (CS9034). Ta korekta jest niezbędna, ponieważ wymagane elementy członkowskie muszą zostać zainicjowane podczas tworzenia obiektu, co wymaga dostępu do zapisu. Podczas tworzenia wystąpień zainicjuj wymagane elementy członkowskie bezpośrednio w inicjatorach obiektów (CS9035, CS9036). Należy przypisać wartość do każdego wymaganego członka, zamiast używać zagnieżdżonych inicjalizatorów członkowskich lub inicjalizatorów kolekcji, ponieważ sam wymagany członek musi być ustawiony przed uzyskaniem dostępu do jego właściwości.
  • SetsRequiredMembers Zastosuj atrybut konstruktorom, które inicjują wszystkie wymagane elementy członkowskie w swoich ciałach (CS9038, CS9039). Ta korekta informuje kompilator, że konstruktor spełnia wymagany kontrakt członkowski, umożliwiając tworzenie obiektów bez inicjatorów obiektów. Jeśli konstruktor tworzy łańcuchy do innego konstruktora z elementem SetsRequiredMembers, musi również mieć atrybut .
  • Unikaj używania wymaganych członków w typach, które muszą spełniać new() ograniczenie (CS9040), ponieważ konstruktor bez parametrów nie może zagwarantować inicjalizacji wymaganych członków bez inicjalizatora obiektu. Nie oznaczaj wymaganych członków jako przestarzałych, chyba że typ, który je zawiera, lub wszystkie konstruktory są przestarzałe (CS9042), aby uniknąć sytuacji, w których członkowie są wymagani, ale ich użycie jest zniechęcane. Wymagane elementy członkowskie nie są dozwolone w instrukcjach najwyższego poziomu ani kontekstach skryptu (CS9045), ponieważ te konteksty nie obsługują składni inicjowania obiektów potrzebnej do ustawienia wymaganych elementów członkowskich.

Aby uzyskać więcej informacji, zobacz artykuł referencyjny wymaganego modyfikatora oraz przewodnik po inicjowaniu obiektów i kolekcji.

Właściwości zwracające referencje

  • CS8145: Właściwości zaimplementowane automatycznie nie mogą być zwracane przez odwołanie
  • CS8147: Właściwości zwracane przez odwołanie nie mogą mieć ustawionych metod dostępu

Aby poprawić błędy właściwości zwracanych ref, zastosuj jedną z następujących zmian w oparciu o określoną diagnostykę:

  • Zaimplementuj właściwość jawnie przy użyciu pola zapasowego i użyj słowa kluczowego ref w wyrażeniu zwracającym akcesora get (CS8145). Ta korekta jest niezbędna, ponieważ automatycznie zaimplementowane właściwości generują prywatne pole zapasowe, którymi kompilator zarządza wewnętrznie. Zwrócenie odwołania do pola prywatnego spowoduje uwidocznienie wewnętrznego przechowywania, do którego wywołujący nie mogą uzyskiwać bezpośredniego dostępu. Aby utworzyć właściwość zwracaną przez odwołanie, zadeklaruj jawne pole i zwróć je ze składnią => ref backingField . Alternatywnie, jeśli nie musisz zwracać odwołania, aby umożliwić bezpośrednią modyfikację pamięci, usuń modyfikator ref z deklaracji właściwości.
  • Usuń akcesor set z właściwości zwracającej ref (CS8147). Poprawka ta jest wymagana, ponieważ właściwość zwracająca odwołanie już zapewnia zarówno odczyt, jak i zapis poprzez zwrócone odwołanie. Wywołujący mogą bezpośrednio modyfikować wartość poprzez odwołanie, bez potrzeby używania osobnej metody ustawiającej. Dołączenie metody dostępu set spowodowałoby utworzenie dwóch różnych mechanizmów modyfikowania tego samego magazynu, co jest zbędne i może prowadzić do nieporozumień co do tego, którą ścieżkę modyfikacji należałoby wybrać.

Aby uzyskać więcej informacji, zobacz zwroty ref i lokalne zmienne ref i Właściwości.