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.
W tym artykule opisano następujące błędy kompilatora:
- CS0132: "konstruktor": konstruktor statyczny musi być bez parametrów.
- CS0514: konstruktor statyczny nie może mieć jawnego wywołania konstruktora "this" lub "base".
- CS0515: modyfikatory dostępu nie są dozwolone w konstruktorach statycznych.
- CS0516: Konstruktor 'konstruktor' nie może się sam wywołać.
- CS0517: "klasa" nie ma klasy bazowej i nie może wywołać konstruktora podstawowego.
- CS0522: struktury nie mogą wywoływać konstruktorów klas bazowych.
- CS0526: Interfejsy nie mogą zawierać konstruktorów wystąpień.
- CS0568: struktury nie mogą zawierać jawnych konstruktorów bez parametrów.
- CS0573: "deklaracja pola": nie może mieć inicjatorów pól wystąpienia w strukturach.
- CS0710: klasy statyczne nie mogą mieć konstruktorów wystąpień.
- CS0768: konstruktor nie może wywołać się za pomocą innego konstruktora.
- CS1018: Oczekiwane słowo kluczowe "this" lub "base".
- CS8054: Enumy nie mogą zawierać jawnych konstruktorów bez parametrów.
- CS8091: nie może być extern i mieć konstruktor inicjujący.
- CS8760: "event": zdarzenie extern nie może mieć inicjatora.
- CS8358: Nie można użyć konstruktora atrybutu, ponieważ ma parametry "in" lub "ref readonly".
- CS8813: Inicjalizator modułu musi być zwykłą metodą członkowską
- CS8814: Metoda inicjowania modułu musi być dostępna na poziomie modułu
- CS8815: Metoda inicjatora modułu musi być statyczna i niewirtualna, nie musi mieć parametrów i musi zwrócić wartość "void"
- CS8816: Metoda inicjowania modułu "method" nie może być ogólna i nie może być zawarta w typie ogólnym
- CS8861: Nieoczekiwana lista argumentów.
- CS8862: Konstruktor zadeklarowany w typie z listą parametrów musi mieć inicjator konstruktora "this".
- CS8867: Nie znaleziono dostępnego konstruktora kopiowania w typie podstawowym "{0}".
- CS8868: Konstruktor kopii w rekordzie musi wywołać konstruktor kopii bazy lub konstruktor obiektu bez parametrów, jeśli rekord dziedziczy z obiektu.
- CS8878: Konstruktor kopii "{0}" musi być publiczny lub chroniony, ponieważ rekord nie jest zapieczętowany.
- CS8900: Inicjator modułu nie może być przypisywany "UnmanagedCallersOnly".
- CS8901: Metoda jest oznaczona jako "UnmanagedCallersOnly" i nie może być wywoływana bezpośrednio. Uzyskaj wskaźnik do funkcji tej metody.
- CS8902: "metoda" jest oznaczona jako 'UnmanagedCallersOnly' i nie można jej przekonwertować na typ delegata. Należy uzyskać wskaźnik funkcji do tej metody.
- CS8910: Podstawowy konstruktor powoduje konflikt z automatycznie generowanym konstruktorem kopii.
- CS8958: Konstruktor struktury bez parametrów musi być "publiczny".
- CS8982: Konstruktor zadeklarowany w "struct" z listą parametrów musi mieć inicjator "this", który wywołuje konstruktor podstawowy lub jawnie zadeklarowany konstruktor.
- CS8983: "struktura" z inicjatorami pól musi zawierać jawnie zadeklarowany konstruktor.
- CS9105: Nie można użyć podstawowego parametru konstruktora w tym kontekście.
- CS9106: Identyfikator jest niejednoznaczny między typem i parametrem w tym kontekście.
- CS9108: Nie można użyć parametru o typie przypominającym ref w metodzie anonimowej, wyrażeniu lambda, wyrażeniu zapytania lub funkcji lokalnej.
-
CS9109: Nie można użyć
ref,outlubinparametru podstawowego konstruktora wewnątrz elementu składowego instancji. - CS9110: Nie można użyć parametru głównego konstruktora, który ma typ ref-podobny, wewnątrz elementu członkowskiego instancji.
- CS9111: metody anonimowe, wyrażenia lambda, wyrażenia zapytania i funkcje lokalne wewnątrz elementu członkowskiego wystąpienia struktury nie mogą uzyskać dostępu do podstawowego parametru konstruktora.
- CS9112: metody Anonimowe, wyrażenia lambda, wyrażenia zapytań i funkcje lokalne wewnątrz struktury nie mogą uzyskać dostępu do podstawowego parametru konstruktora używanego również wewnątrz elementu członkowskiego wystąpienia.
- CS9114: Podstawowy parametr konstruktora typu readonly nie może być przypisany (z wyjątkiem inicjatora init-only typu lub inicjatora zmiennej).
- CS9115: Podstawowy parametr konstruktora typu readonly nie może być zwracany przez odwołanie zapisywalne.
- CS9116: podstawowy parametr konstruktora typu readonly nie może być używany jako wartość ref lub out (z wyjątkiem inicjalizatora init-only typu lub inicjalizatora zmiennej).
- CS9117: Składowe parametru podstawowego konstruktora w typie readonly nie mogą być modyfikowane (z wyjątkiem settera dostępnego tylko podczas inicjowania typu lub inicjatora zmiennej).
- CS9118: Członkowie podstawowych parametrów konstruktora typu tylko do odczytu nie mogą być zwracane jako odwołania pozwalające na zapis.
-
CS9119: Składowe podstawowego parametru konstruktora typu readonly nie mogą być używane jako wartość
reflubout(z wyjątkiem inicjatora init-only typu lub inicjatora zmiennej). - CS9120: Nie można zwrócić podstawowego parametru konstruktora według odwołania.
- CS9121: Parametr podstawowego konstruktora struktury typu powoduje cykl w układzie struktury.
- CS9122: Nieoczekiwana lista parametrów.
- CS9136: Nie można użyć podstawowego parametru konstruktora typu wewnątrz instancji członkowskiej.
Ponadto w tym artykule omówiono następujące ostrzeżenia:
- CS0824: Konstruktor o nazwie "name" jest oznaczony jako zewnętrzny.
- CS9107: parametr jest przechwytywany do stanu typu zawierającego, a jego wartość jest również przekazywana do konstruktora podstawowego. Wartość ta może być także przechwycona przez klasę bazową.
- CS9113: parametr jest nieprzeczytany.
- CS9124: parametr jest przechwytywany do stanu otaczającego typu, a jego wartość jest również używana do inicjowania pola, właściwości lub zdarzenia.
- CS9179: Podstawowy parametr konstruktora jest przesłonięty przez członka z klasy bazowej
- CS9018: Właściwość implementowana automatycznie jest odczytywana przed jawnym przypisaniem, powodując wcześniejsze niejawne przypisanie "default".
- CS9019: Pole jest odczytywane przed jawnym przypisaniem, powodując wcześniejsze niejawne przypisanie "default".
- CS9020: Obiekt "this" jest odczytywany przed przypisaniem wszystkich jego pól, co powoduje wcześniejsze przypisanie wartości 'default' do pól, które nie zostały jawnie przypisane.
- CS9021: Kontrola jest zwracana do wywołującego przed jawnym przypisaniem właściwości automatycznej, co powoduje wcześniejsze niejawne przypisanie wartości domyślnej.
- CS9022: Kontrola jest zwracana do wywołującego przed jawnym przypisaniem pola, powodując wcześniejsze niejawne przypisanie wartości 'domyślnej'.
Konstruktory statyczne
- CS0132: "konstruktor": konstruktor statyczny musi być bez parametrów.
- CS0514: Konstruktor statyczny nie może zawierać jawnego wywołania konstruktora 'this' lub 'base'.
CS0515 :modyfikatory dostępu nie są dozwolone w konstruktorach statycznych.
Konstruktory statyczne inicjują dane statyczne dla typu. Aby uzyskać więcej informacji, zobacz Konstruktory statyczne.
Aby naprawić te błędy, upewnij się, że deklaracja konstruktora statycznego jest zgodna z następującymi regułami:
- Usuń wszystkie parametry z deklaracji konstruktora statycznego, ponieważ konstruktor statyczny musi być bez parametrów (CS0132). Jeśli musisz przekazać wartości inicjowania, rozważ użycie pól statycznych lub właściwości ustawionych przed uruchomieniem konstruktora statycznego.
- Usuń wszelkie modyfikatory dostępu, takie jak
public,protected,privatelubinternalze statycznego konstruktora, ponieważ środowisko uruchomieniowe steruje, gdy konstruktor statyczny wykonuje modyfikatory dostępu i modyfikatory dostępu nie są istotne (CS0515). - Usuń wszystkie wywołania inicjatora
: base()lub konstruktora: this()ze statycznego konstruktora, ponieważ statyczne konstruktory nie mogą tworzyć łańcucha z innymi konstruktorami (CS0514). Środowisko uruchomieniowe automatycznie wywołuje konstruktor statyczny klasy bazowej, jeśli istnieje.
Deklaracja konstruktora
- CS0526: Interfejsy nie mogą zawierać konstruktorów wystąpień.
- CS0710: klasy statyczne nie mogą mieć konstruktorów wystąpień.
- CS8054: wyliczenie nie może zawierać jawnych konstruktorów bez parametrów.
- CS8358: Nie można użyć konstruktora atrybutu, ponieważ ma parametry "in" lub "ref readonly".
- CS8091: Konstruktor nie może być zewnętrzny i mieć inicjalizatora konstruktora.
- CS8760: "event": zdarzenie extern nie może mieć inicjatora.
Konstruktory można zadeklarować tylko w typach class i , struct w tym record class i record struct . Aby uzyskać więcej informacji, zobacz Konstruktory wystąpień.
Aby naprawić te błędy, wypróbuj następujące sugestie:
- Przenieś konstruktora do typu
classlubstruct, ponieważ nie można zadeklarować konstruktorów w typachinterfacelubenum(CS0526, CS8054). Interfejsy definiują kontrakty, ale nie zapewniają logiki inicjowania, a typy wyliczeniowe mają swoje wartości zdefiniowane w czasie kompilacji. - Usuń konstruktory instancji z klas statycznych, ponieważ klasy statyczne nie mogą być instancjonowane i dlatego nie mogą mieć konstruktorów instancji (CS0710). Jeśli potrzebujesz logiki inicjowania, zamiast tego użyj konstruktora statycznego.
- Zmień parametry
inlubref readonlyna parametry przekazywane przez wartość w konstruktorach atrybutów, ponieważ nie obsługują one modyfikatorów parametrówinaniref readonly(CS8358). Środowisko uruchomieniowe tworzy wystąpienie atrybutów przy użyciu odbicia, który nie obsługuje modyfikatorówinaniref readonly. -
: base()Usuń inicjator konstruktora: this()zextern, ponieważ konstruktory extern nie mogą odwoływać się do innych konstruktorów (CS8091). Implementacja konstruktora extern jest realizowana zewnętrznie, więc łączenie konstruktorów nie jest możliwe. - Usuń inicjator z
externdeklaracji zdarzenia (CS8760). Zdarzenia zewnętrzne mają akcesory dodawania i usuwania dostarczane przez kod zewnętrzny, więc inicjalizator pola w kodzie źródłowym nie ma żadnego wpływu i nie jest dozwolony przez kompilator.
Dla deklaracji konstruktorów można wygenerować następujące ostrzeżenie:
- CS0824: konstruktor jest oznaczony jako zewnętrzny.
Gdy konstruktor jest oznaczony extern, kompilator nie może sprawdzić, czy implementacja istnieje. Aby pominąć to ostrzeżenie, podaj implementację inną niż extern lub upewnij się, że implementacja zewnętrzna jest poprawnie połączona.
Konstruktory w typach struktur
- CS0568: struktury nie mogą zawierać jawnych konstruktorów bez parametrów.
- CS0573: "deklaracja pola": nie może mieć inicjalizatorów pól instancji w strukturach.
- CS8958: Konstruktor struktury bez parametrów musi być publiczny.
- CS8982: Konstruktor zadeklarowany w „strukturze” z listą parametrów musi mieć inicjator „this”, który wywołuje konstruktor główny lub jawnie zadeklarowany konstruktor.
- CS8983: "struktura" z inicjatorami pól musi zawierać jawnie zadeklarowany konstruktor.
Typy struktur mają określone reguły dotyczące konstruktorów i inicjowania pól. Aby uzyskać więcej informacji, zobacz sekcję Inicjowanie struktury i wartości domyślne w artykule Typy struktury .
Aby naprawić te błędy, wypróbuj następujące sugestie:
- Uaktualnij do wersji C# 10 lub nowszej, jeśli wystąpi cs0568 lub CS0573, ponieważ te błędy występują tylko w starszych wersjach języka C#. Nowoczesny język C# umożliwia jawne konstruktory bez parametrów i inicjatory pól w strukturach.
- Dodaj modyfikator dostępu do każdego konstruktora struktury bez parametrów. Konstruktory struktury bez parametrów muszą być publiczne, aby zapewnić, że wyrażenia i alokacje tablic mogą prawidłowo zainicjować instancje struktur (
public). -
: this(...)Dodaj inicjator do jawnie zadeklarowanych konstruktorów w strukturze, która ma konstruktor podstawowy, ponieważ wszystkie konstruktory z parametrami muszą łączyć się z konstruktorem podstawowym lub innym jawnie zadeklarowanym konstruktorem w celu zapewnienia spójnej inicjalizacji (CS8982). - Zadeklaruj jawny konstruktor, gdy struktura używa inicjatorów pól, ponieważ kompilator wymaga jawnego konstruktora, aby upewnić się, że inicjatory pól są wywoływane (CS8983). Ten konstruktor może być konstruktorem bez parametrów z pustą treścią.
Następujące ostrzeżenia wskazują, że pole lub właściwość nie są jawnie przypisane przed odczytem lub zanim kontrola wróci do obiektu wywołującego:
- CS9018: Właściwość implementowana automatycznie jest odczytywana przed jawnym przypisaniem, powodując wcześniejsze niejawne przypisanie "default".
- CS9019: Pole jest odczytywane przed jawnym przypisaniem, powodując wcześniejsze niejawne przypisanie "default".
- CS9020: Obiekt "this" jest odczytywany przed przypisaniem wszystkich jego pól, co powoduje automatyczne przypisanie wartości domyślnych do pól nieprzypisanych jawnie.
- CS9021: Kontrolka jest zwracana do obiektu wywołującego przed jawnym przypisaniem właściwości implementowanej automatycznie, powodując wcześniejsze niejawne przypisanie "default".
- CS9022: Kontrolka jest zwracana do obiektu wywołującego przed jawnym przypisaniem pola, powodując wcześniejsze niejawne przypisanie wartości "default".
Aby wyciszyć te ostrzeżenia, jawnie przypisz wszystkie pola i właściwości zaimplementowane automatycznie przed ich odczytaniem lub przed zwróceniem sterowania z konstruktora (CS9018, CS9019, CS9020, CS9021, CS9022). Gdy nieprzypisane elementy członkowskie są odczytywane, kompilator niejawnie przypisuje im wartość default, co może nie być zamierzonym zachowaniem.
Wywołania konstruktora z base i this
- CS0516: Konstruktor nie może wywołać samego siebie.
- CS0517: klasa nie ma klasy bazowej i nie może wywołać konstruktora podstawowego.
- CS0522: struktury nie mogą wywoływać konstruktorów klas bazowych.
- CS0768: konstruktor nie może wywołać się za pomocą innego konstruktora.
- CS1018: Oczekiwane słowo kluczowe "this" lub "base".
Za pomocą inicjatorów konstruktorów jeden konstruktor może wywołać inny konstruktor za pomocą metody : this() lub : base(). Aby uzyskać więcej informacji, zobacz Using constructors (Używanie konstruktorów).
Aby naprawić te błędy, wypróbuj następujące sugestie:
- Przerwij wszystkie łańcuchy cyklicznych wywołań konstruktorów, ponieważ konstruktor nie może wywoływać siebie ani bezpośrednio, ani pośrednio przez inny konstruktor (CS0516, CS0768). Upewnij się, że łańcuch konstruktorów ostatecznie kończy się na konstruktorze, który nie wywołuje żadnego innego konstruktora w tym samym typie.
- Usuń inicjalizator z konstruktorów w typach struktur lub z konstruktorów w
: base(), ponieważ te typy nie mają konstruktora klasy bazowej do wywołania (System.Object, CS0522). Typy struktur niejawnie dziedziczą z System.ValueType, ale nie można jawnie wywołać jego konstruktora. - Ukończ inicjator konstruktora lub usuń dwukropek (
:) z deklaracji konstruktora, ponieważ gdy dwukropek następuje po sygnaturze konstruktora, kompilator oczekuje albothis()albobase()(CS1018). Dodaj odpowiednie wywołanie konstruktora lub usuń dwukropek całkowicie, jeśli nie jest zamierzone połączenie.
Rekordy i konstruktory kopii
- CS8867: Nie znaleziono dostępnego konstruktora kopiowania w typie podstawowym.
- CS8868: Konstruktor kopii w rekordzie musi wywołać konstruktor kopii bazy lub konstruktor obiektu bez parametrów, jeśli rekord dziedziczy z obiektu.
- CS8878: Konstruktor kopii musi być publiczny lub chroniony, ponieważ rekord nie jest zapieczętowany.
- pl-PL: CS8910: Podstawowy konstruktor wchodzi w konflikt z syntetyzowanym konstruktorem kopii.
W typie rekordu pochodnego konstruktor kopii jawny musi wywołać konstruktor kopiujący typu podstawowego przy użyciu inicjatora : this() . Jeśli rekord bezpośrednio dziedziczy z System.Object, może wywołać konstruktor obiektu bez parametrów (CS8868).
Rekordy zawierają konstruktor kopiujący syntetyzowany przez kompilator. Można napisać jawny konstruktor kopiujący, ale musi spełniać określone wymagania. Kompilator generuje błędy, gdy konstruktory kopiowania rekordów naruszają następujące wymagania:
- Typ podstawowy musi mieć dostępny konstruktor kopiujący. Wszystkie
recordtypy mają konstruktor kopiujący. Upewnij się, że typ podstawowy torecord, lub dodaj do niego dostępny konstruktor kopiujący (CS8867). - W typie rekordu pochodnego konstruktor kopii jawny musi wywołać konstruktor kopiujący typu podstawowego przy użyciu inicjatora
: base(). Jeśli rekord bezpośrednio dziedziczy z System.Object, może wywołać konstruktor obiektu bez parametrów (CS8868). - Konstruktory kopii muszą być
publiclubprotected, chyba że typ rekordu tosealed. Dodaj odpowiedni modyfikator dostępu do konstruktora kopiowania (CS8878). - Jeśli jawny konstruktor kopiowania ma ten sam podpis co automatycznie generowany konstruktor kopiowania, dochodzi do konfliktu definicji. Usuń jawny konstruktor kopiowania lub zmodyfikuj jego podpis (CS8910).
Deklaracje inicjatora modułu
- CS8813: Inicjator modułu musi być zwykłą metodą składową.
- CS8814: Metoda inicjowania modułu "method" musi być dostępna na poziomie modułu.
- CS8815: Metoda inicjowania modułu musi być statyczna i niewirtualna, nie musi mieć parametrów i musi zwracać wartość "void".
- CS8816: Metoda inicjowania modułu "method" nie może być ogólna i nie może być zawarta w typie ogólnym.
- CS8900: Inicjator modułu nie może być przypisywany "UnmanagedCallersOnly".
- CS8901: "metoda" jest przypisywana "UnmanagedCallersOnly" i nie może być wywoływana bezpośrednio. Uzyskaj wskaźnik funkcji do tej metody.
- CS8902: "metoda" oznaczona atrybutem "UnmanagedCallersOnly" nie może być przekonwertowana na typ delegata. Uzyskaj wskaźnik funkcji do tej metody.
Te błędy wymuszają wymagania dotyczące metod oznaczonych jako ModuleInitializerAttribute. Inicjatory modułów są uruchamiane automatycznie po pierwszym załadowaniu zestawu przed wykonaniem jakiegokolwiek innego kodu w module. Aby zapoznać się z pełnymi regułami, zobacz Inicjatory modułów.
Aby naprawić te błędy, zastosuj jedną z następujących zmian na podstawie określonej diagnostyki:
- Upewnij się, że metoda oznaczona jako
[ModuleInitializer]to zwykła metoda, a nie akcesor właściwości, akcesor zdarzeń, funkcja lokalna, lambda, konstruktor, destruktor lub operator (CS8813). Kompilator może traktować tylko zwykłą deklarację metody jako prawidłowy element docelowy dla infrastruktury inicjatora modułu. - Ustaw metodę inicjatora modułu oraz wszystkie typy ją zawierające na
internallubpublic, aby metoda była dostępna poza typem najwyższego poziomu (CS8814). Środowisko uruchomieniowe musi wywołać metodę z wygenerowanego kodu na poziomie modułu, który wymaga ułatwień dostępu na poziomie modułu. - Zadeklaruj metodę inicjatora modułu jako
static, inną niż wirtualną, bez parametrów i z typem zwrotnymvoid(CS8815). Środowisko uruchomieniowe wywołuje inicjatory modułów bez żadnych argumentów i odrzuca wynik, więc podpis metody musi dokładnie odpowiadać tym ograniczeniom. - Usuń parametry typu ogólnego z metody inicjatora modułu i przenieś tę metodę poza jakikolwiek zawierający typ ogólny (CS8816). Środowisko uruchomieniowe nie może określić, które argumenty typu mają być dostarczane podczas wywoływania inicjatora, więc metody ogólne i metody w typach ogólnych nie są dozwolone.
- Usuń element UnmanagedCallersOnlyAttribute z metody inicjatora modułu (CS8900). Inicjatory modułów są wywoływane przez zarządzaną infrastrukturę środowiska uruchomieniowego, więc nie mogą być ograniczone tylko do niezarządzanych obiektów wywołujących.
- Uzyskaj wskaźnik funkcji zamiast wywoływać metodę oznaczoną
[UnmanagedCallersOnly]bezpośrednio (CS8901). Metody oznaczone UnmanagedCallersOnlyAttribute nie mogą być wywoływane z kodu zarządzanego. Użyj operatora&, aby uzyskać wskaźnik funkcji (delegate* unmanaged<...>) w kontekścieunsafei przekazać go do kodu niezarządzanego. Jeśli projekt nie zezwala jeszcze na niebezpieczny kod, włącz polecenieAllowUnsafeBlocks. - Uzyskaj wskaźnik funkcji zamiast konwertować metodę oznaczoną
[UnmanagedCallersOnly]na typ delegata (CS8902). Metody z atrybutem UnmanagedCallersOnlyAttribute nie mogą być reprezentowane jako zarządzane delegaty, ponieważ konwencja wywoływania jest niezgodna. Zamiast tego użyj wskaźników funkcji (delegate* unmanaged<...>) wunsafekontekście. Jeśli projekt nie zezwala jeszcze na niebezpieczny kod, włącz polecenieAllowUnsafeBlocks.
Aby uzyskać więcej informacji, zobacz ModuleInitializerAttribute i UnmanagedCallersOnlyAttribute.
Podstawowa deklaracja konstruktora
Konstruktory podstawowe deklarują parametry bezpośrednio w deklaracji typu. Kompilator syntetyzuje pole do przechowywania podstawowego parametru konstruktora podczas używania go w inicjatorach elementów członkowskich lub pól.
Łańcuch konstruktora
- CS8861: Nieoczekiwana lista argumentów.
- CS8862: Konstruktor zadeklarowany w typie z listą parametrów musi mieć inicjalizator konstruktora „this”.
- CS9122: Nieoczekiwana lista parametrów.
Gdy typ ma konstruktor podstawowy, wszystkie inne jawnie zadeklarowane konstruktory muszą odwoływać się do niego za pomocą : this(...).
Aby naprawić te błędy, wypróbuj następujące sugestie:
- Dodaj inicjator
: this(...), który przekazuje odpowiednie argumenty do głównego konstruktora, ponieważ wszystkie jawnie zadeklarowane konstruktory muszą odwołać się do głównego konstruktora (CS8862). - Usuń listę parametrów z odwołania typu podstawowego, gdy typ podstawowy nie ma konstruktora podstawowego, ponieważ składnia
class Derived : Base(args)jest prawidłowa tylko wtedy, gdyBasema konstruktor podstawowy (CS8861). - Usuń podstawową listę parametrów konstruktora z
interfacedeklaracji, ponieważ interfejsy nie mogą mieć konstruktorów podstawowych (CS9122).
Użycie parametrów w wywołaniach konstruktora podstawowego
- CS9105: Nie można użyć podstawowego parametru konstruktora w tym kontekście.
- CS9106: identyfikator jest niejednoznaczny między typem a parametrem w tym kontekście.
Podstawowe parametry konstruktora można używać tylko w wywołaniu konstruktora podstawowego, jeśli przekazujesz je jako część podstawowej deklaracji konstruktora.
Aby naprawić te błędy, wypróbuj następujące sugestie:
- Przenieś użycie parametru do klauzuli podstawowej deklaracji typu zamiast używać go w jawnie zadeklarowanym wywołaniu konstruktora, ponieważ podstawowe parametry konstruktora
: base()mogą pojawiać się tylko w klauzuli podstawowej deklaracji typu (CS9105). - Zmień nazwę typu lub parametru, gdy typ i podstawowy parametr konstruktora mają taką samą nazwę, ponieważ odwołanie staje się niejednoznaczne (CS9106).
Parametry typu przypominającego ref
- CS9108: Nie można użyć parametru o typie przypominającym ref w metodzie anonimowej, wyrażeniu lambda, wyrażeniu zapytania lub funkcji lokalnej.
-
CS9109: Nie można użyć
ref,outlubinpodstawowego parametru konstruktora wewnątrz składowej instancji. - CS9110: Nie można użyć podstawowego parametru konstruktora, który ma typ podobny do odwołania wewnątrz elementu członkowskiego wystąpienia.
- CS9136: Nie można użyć podstawowego parametru konstruktora typu wewnątrz elementu członkowskiego wystąpienia.
Aby rozwiązać te błędy:
- Podstawowe parametry konstruktora typu
ref structmają ograniczenia dotyczące tego, gdzie można ich używać. Przenieś dostęp do parametru z wyrażeń lambda, wyrażeń zapytań lub funkcji lokalnych (CS9108). W typach, które nie sąref struct, uzyskaj dostęp do parametrów tylko w inicjatorach pól lub w ciele konstruktora, a nie w członkach instancji (ref struct, CS9136). - W przypadku typów
ref struct, nie można używać podstawowych parametrów konstruktora z modyfikatoramiin,ref, luboutw metodach instancji lub akcesorach właściwości. Skopiuj wartość parametru do pola w konstruktorze i użyj tego pola w członkach instancji (CS9109).
Ograniczenia typu struktury
- CS9111: metody Anonimowe, wyrażenia lambda, wyrażenia zapytania i funkcje lokalne wewnątrz elementu członkowskiego wystąpienia struktury nie mogą uzyskać dostępu do podstawowego parametru konstruktora.
- CS9112: Metody anonimowe, wyrażenia lambda, wyrażenia zapytań i funkcje lokalne wewnątrz struktury nie mogą uzyskać dostępu do podstawowego parametru konstruktora, który jest również używany wewnątrz członka instancji.
- CS9120: Nie można zwrócić parametru konstruktora podstawowego według odwołania.
- CS9121: parametr podstawowego konstruktora struktury typu powoduje cykl w układzie struktury.
Aby rozwiązać te błędy:
- W typach struktur nie można przechwytywać podstawowych parametrów konstruktora w wyrażeniach lambda, wyrażeniach zapytania lub funkcjach lokalnych wewnątrz elementów członkowskich wystąpienia. Skopiuj parametr do zmiennej lokalnej lub pola przed użyciem go w tych kontekstach (CS9111, CS9112).
- Nie można zwrócić podstawowych parametrów konstruktora przez odwołanie w typach strukturalnych. Zapisz wartość w polu i w razie potrzeby zwróć to pole przez referencję (CS9120).
- Upewnij się, że typ podstawowego parametru konstruktora nie tworzy cyklu w układzie struktury. Struktura nie może zawierać pola własnego typu bezpośrednio lub pośrednio (CS9121).
Ograniczenia tylko do odczytu struktury
- CS9114: Podstawowy parametr konstruktora typu tylko do odczytu nie może być przypisany (z wyjątkiem inicjatora tylko do inicjowania typu lub inicjatora zmiennej).
- CS9115: Podstawowy parametr konstruktora typu readonly nie może być zwracany przez referencję do zapisu.
-
CS9116: Podstawowy parametr konstruktora typu tylko do odczytu nie może być używany jako wartość
reflubout(chyba że w setterze tylko do inicjalizacji tego typu lub jako inicjator zmiennej). - pl-PL: CS9117: Składowe parametru podstawowego konstruktora typu tylko do odczytu nie mogą być modyfikowane (z wyjątkiem w przypadku settera tylko do inicjalizacji w typie lub inicjalizatora zmiennej).
- CS9118: Członkowie podstawowego parametru konstruktora typu readonly nie mogą być zwracane przez odwołanie do zapisu.
-
CS9119: Członkowie podstawowego parametru konstruktora typu readonly nie mogą być używane jako wartość
reflubout(z wyjątkiem inicjatora init-only typu lub inicjatora zmiennej).
Aby rozwiązać te błędy:
- W
readonly structtypach nie można modyfikować podstawowych parametrów konstruktora i ich składowych poza setterami tylko do inicjalizacji ani inicjatorami zmiennych. Przenieś przypisania do inicjatorów pól lub setterów właściwości tylko do inicjacji (CS9114, CS9117). - Nie można zwrócić podstawowych parametrów konstruktora i ich składowych przez zapisywalne odwołanie w
readonly structtypach. Zamiast tego zwracaj wartośćreadonly reflub (CS9115, CS9118). - Nie można przekazać podstawowych parametrów konstruktora i ich członków jako
refargumentówoutwreadonly structtypach. Przekaż je przez wartość lub jakoinargument (CS9116, CS9119).
Ostrzeżenia dotyczące przechwyconych i przesłoniętych parametrów
- CS9107: Parametr jest przechwytywany w stanie otaczającego typu, a jego wartość jest również przekazywana do konstruktora podstawowego. Wartość może zostać również przechwycona przez klasę bazową.
- CS9113: Parametr jest nieprzeczytany.
- CS9124: parametr jest przechwytywany w stanie zamykającego typu, a jego wartość jest również używana do inicjowania pola, właściwości lub zdarzenia.
- CS9179: Podstawowy parametr konstruktora jest przysłonięty przez członek klasy bazowej.
Następujące ostrzeżenia wskazują potencjalne problemy ze sposobem przechowywania lub uzyskiwania dostępu do podstawowych parametrów konstruktora:
- Parametr można przechowywać dwa razy, jeśli obaj przekażesz go do konstruktora podstawowego i uzyskasz do niego dostęp w typie pochodnym. Może istnieć jedna kopia w klasie bazowej, a druga w klasie pochodnej. Zastanów się, czy potrzebujesz obu kopii, czy restrukturyzacji kodu, aby uniknąć duplikowania (CS9107).
- Nie potrzebujesz podstawowego parametru konstruktora, jeśli nigdy go nie odczytasz. Usuń nieużywane parametry z podstawowej deklaracji konstruktora (CS9113).
- Parametr można przechowywać dwa razy, jeśli przechwycisz go w typie otaczającym i użyjesz go do zainicjowania pola, właściwości lub zdarzenia. Rozważ użycie przechwyconego parametru bezpośrednio zamiast inicjowania oddzielnego członka (CS9124).
- Członek bazowego typu przesłania podstawowy parametr konstruktora, gdy oba mają tę samą nazwę. Zmień nazwę parametru, aby uniknąć nieporozumień (CS9179).