Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
internalwłaściwość może mieć metodę dostępuprivate, ale nie metodę dostępupublic. 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 isetdo 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
privatena mniej restrykcyjny modyfikator (CS0442). Składowe abstrakcyjne muszą być dostępne dla klas pochodnych, aby te klasy mogły zapewnić implementacje. Użyj wartościprotected,internallubprotected internalzamiastprivate.
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
voidna prawidłowy typ (CS0547). Właściwości i indeksatory reprezentują wyrażenia ivoidnie są prawidłowym typem wyrażenia. Wybierz odpowiedni typ danych reprezentowanych przez właściwość. - Dodaj co najmniej jedną metodę dostępu (
get,setlubinit) 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 akcesorget, akcesorsetlubinit, 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_PropertyNameiset_PropertyName, ale wywołują te metody za pomocą składni właściwości (obj.Propertyiobj.Property = value). Ta sama zasada dotyczy operatorów. Użyj składni operatora (++obj) zamiast wywoływania metod, takich jakop_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, jakgetisetdo 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 kluczowegofield, dodanego w wersji C# 13, w celu uzyskania dostępu do polu zapasowemu wygenerowanemu przez kompilator w ciele akcesora. W przypadku właściwościabstractlubexternusuń ciała akcesorów, ponieważ implementacja jest udostępniana gdzie indziej. W przypadkupartialwł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,setlubinit(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
overridedla właściwości może dotyczyć tylko właściwościvirtual,abstractluboverridew klasie bazowej. Aby zasłonić składową niebędącą właściwością za pomocą właściwości, użyj słowa kluczowegonewzamiastoverride. - 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ć akcesorasetza pośrednictwem przesłonięcia. Dodaj brakujący akcesor do klasy bazowej i oznacz jąvirtual, lub użyjnew, 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ą akcesorsetlubinit, 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 iset, 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
fieldna inny identyfikator lub użyj@fieldskładni ucieczki, aby odwołać się do zmiennej (CS9258, CS9273). Ta korekta jest niezbędna, ponieważfieldjest 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 nazwiefieldzamiast zsyntetyzowanego pola zapasowego, użyjthis.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 kluczowegofieldsugeruje, że może to być wartość null. Alternatywnie zmień typ właściwości na nullable, dodaj modyfikatorrequiredaby zapewnić inicjalizację lub zainicjalizuj właściwość w konstruktorze. - Konsekwentnie należy stosować słowo kluczowe
fieldw 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
setlubinitmetodę 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żyjinitakcesora zamiastsetakcesora. 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
readonlypodczas deklarowania ich wewnątrzreadonly struct(CS8341). Ta poprawka wymusza zasadę niezmienności dla struktury, zapewniając, że wszyscy członkowie instancji przestrzegają gwarancjireadonly. Jeśli właściwość musi być modyfikowalna, usuń modyfikatorreadonlyz deklaracji struktury lub zaimplementuj właściwość przy użyciu jawnego pola pomocniczego oraz ciał akcesorów, które nie modyfikują stanu wystąpienia. -
readonlyUsuń modyfikator z deklaracji właściwości statycznych lub metod dostępu (CS8657). Ta korekta jest wymagana, ponieważ modyfikatorreadonlyma 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ń akcesorsetzamiast stosować modyfikatorreadonly. - Usuń modyfikator
readonlyz automatycznie zaimplementowanych akcesorówsetlub zastosuj go tylko do akcesoraget(CS8658). Ta korekta jest niezbędna, ponieważsetmetody dostępu z natury modyfikują stan, który jest sprzeczny z celemreadonlymodyfikatora, 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 akcesorainitzamiast akcesoraset. -
readonlyUsuń ten modyfikator z deklaracji właściwości, gdy właściwość ma akcesorset(CS8659). Poprawka ta jest wymagana, ponieważ właściwości zsetakcesorami mogą modyfikować stan instancji, co naruszareadonlygwarancję. Jeśli potrzebujesz ustawienia wyłącznie podczas inicjalizacji, zastąp akcesorsetakcesoreminitlub całkowicie usuń akcesorset, aby właściwość była naprawdę tylko do odczytu. - Umieść modyfikator
readonlyna 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 jakoreadonly, 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 isetsą obecne podczas zaznaczania poszczególnych akcesoriów jakoreadonly(CS8664). Ta korekta jest konieczna, ponieważreadonlymodyfikator 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 tylkogetakcesor, oznacz całą właściwość jakoreadonlyzamiastgetakcesora.
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
initakcesora (CS8852). Nie można przypisywać właściwości tylko do inicjowania po zakończeniu budowy obiektu. Przypisz wartość w treści konstruktora, akcesorzeinitlub wyrażeniu inicjatora obiektu (new MyType { Property = value }). Jeśli musisz przypisać nieruchomość po budowie, zmieńinitakcesorium nasetakcesorium. - Dopasuj
initlubsetrodzaj akcesora przy zastępowaniu właściwości (CS8853). Jeśli właściwość klasy bazowej używa metody dostępuinit, zastępująca właściwość musi również używać metody dostępuinit. Podobnie, jeśli baza używaset, 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 (
initlubset) 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
initz deklaracji właściwości statycznych lub zmień go na akcesorset(CS8856). Akcesorinitjest 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
readonlyz akcesorainit(CS8903). Modyfikatorreadonlypola struktury gwarantuje, że pole nie zmieni wystąpienia struktury. Ponieważ metoda dostępuinitprzypisuje stan wystąpienia, z natury zmienia strukturę i nie może być oznaczona jakoreadonly. Aby ustawić akcesorgetreadonly, zastosuj modyfikatorreadonlytylko do akcesoraget.
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
fieldw 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
getdo 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
requiredjako nazwy typu lub aliasu (CS9029). Ta korekta jest niezbędna, ponieważrequiredjest 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ą
requiredmodyfikator 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.
-
requiredUż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.
-
SetsRequiredMembersZastosuj 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 elementemSetsRequiredMembers, 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
refw wyrażeniu zwracającym akcesoraget(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ń modyfikatorrefz deklaracji właściwości. - Usuń akcesor
setz 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ępusetspowodował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.