Udostępnij za pośrednictwem


Usuwanie błędów i ostrzeżeń w deklaracjach konstruktorów

W tym artykule opisano następujące błędy kompilatora:

  • 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 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.
  • CS0526: interfejsy nie mogą zawierać konstruktorów.
  • CS0568: struktury nie mogą zawierać jawnych konstruktorów bez parametrów.
  • CS0710: klasy statyczne nie mogą mieć konstruktorów wystąpień.
  • CS0768: konstruktor nie może wywołać się za pomocą innego konstruktora.
  • CS8054: Enumy nie mogą zawierać jawnych konstruktorów bez parametrów.
  • CS8091: nie może być extern i mieć konstruktor inicjujący.
  • CS8861: Nieoczekiwana lista argumentów.
  • CS8862: Konstruktor zadeklarowany w typie z listą parametrów musi mieć inicjator konstruktora "this".
  • CS8358: Nie można użyć konstruktora atrybutu, ponieważ ma parametry "in".
  • 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.
  • 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, outlub in parametru 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ść ref lub out (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

Konstruktory statyczne

  • CS0514: Konstruktor statyczny nie może zawierać jawnego wywołania konstruktora 'this' lub 'base'.
  • CS0515: modyfikatory dostępu nie są dozwolone w konstruktorach statycznych.

Dla typu można napisać co najwyżej jeden konstruktor statyczny. Deklaracja konstruktora statycznego musi przestrzegać następujących reguł:

  • Konstruktor statyczny ma modyfikator static, ale nie ma innych modyfikatorów, takich jak public, protected, privatelub internal.
  • Konstruktor statyczny musi być konstruktorem bez parametrów.
  • Konstruktor statyczny nie może wywoływać base() ani this(). Jeśli klasa bazowa zawiera konstruktor statyczny, środowisko uruchomieniowe wywołuje ją automatycznie.

Deklaracja konstruktora

  • CS0526: interfejsy nie mogą zawierać konstruktorów.
  • 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 on parametry "in".
  • CS8091: Konstruktor nie może być zewnętrzny i mieć inicjalizatora konstruktora.

Konstruktory są dozwolone tylko w typach class i struct oraz w typach record class i record struct. Nie można ich definiować w typach enum ani interface. Ponadto typy klas atrybutu nie mogą deklarować parametrów in. Zamiast tego przekaż parametry według wartości.

Można zadeklarować konstruktory extern, ale nie można użyć wywołań konstruktorów base() ani this() w celu wywołania innego konstruktora niż ten zadeklarowany jako extern.

Ponadto dla deklaracji konstruktorów można wygenerować następujące ostrzeżenia:

  • CS0824: konstruktor jest oznaczony jako zewnętrzny.

Gdy konstruktor jest oznaczony extern, kompilator nie może zagwarantować, że konstruktor istnieje. W związku z tym kompilator generuje to ostrzeżenie.

Konstruktory w typach struktur

  • CS0568: struktury nie mogą zawierać jawnych konstruktorów bez parametrów.
  • 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.

Ostatnie funkcje w języku C# usuwają wcześniejsze ograniczenia dotyczące typów struct. CS0568 jest generowany podczas deklarowania konstruktora wystąpienia bez parametrów w starszych wersjach języka C#. Można zadeklarować jawny konstruktor wystąpienia bez parametrów w nowszych wersjach języka C#. Ten konstruktor bezparametrowy oznaczony jako jawny musi być public. Jeśli struct deklaruje jakiekolwiek inicjatory pól , należy również zadeklarować jawny konstruktor wystąpienia. Ten konstruktor może być konstruktorem bez parametrów z pustą treścią.

Gdy typ struct deklaruje konstruktor podstawowy, w tym typy record struct, wszystkie inne konstruktory wystąpień z wyjątkiem konstruktora bez parametrów muszą wywoływać konstruktor podstawowy lub inny jawnie zadeklarowany konstruktor przy użyciu this().

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.

Można użyć base() i this(), aby jeden konstruktor wywołał inny w tym samym typie lub typie bazowym. Wywoływanie konstruktorów może zminimalizować zduplikowaną logikę konstruktora. Podczas wywoływania innego konstruktora przy użyciu this() lub base()należy postępować zgodnie z tymi regułami:

  • Konstruktor nie może wywoływać się bezpośrednio lub pośrednio za pośrednictwem innego konstruktora. Na przykład następujący kod jest nielegalny:

    public class C
    {
      public C() : this() // Error!
      {
      }
    }
    
    public class C2
    {
      public class C2() : this(10) {}
    
      public class C2(int capacity) : this() 
      {
          _capacity = capacity;
      }
    
      private int _capacity;
    }
    ``
    
    
  • Typy struktur nie mogą wywoływać base(). Ani System.Object.

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.

Dodanie modyfikatora record do typu struct lub class powoduje utworzenie rekordu . Rekord zawiera konstruktora kopiowania syntetyzowanego przez kompilator . Można samodzielnie napisać jawny konstruktor kopiowania, ale musi być zgodny z następującymi regułami:

  • Konstruktory kopii muszą być public lub protected, chyba że typ jest sealed.
  • Konstruktory kopii muszą wywoływać konstruktor kopiujący base(), chyba że klasa bazowa jest System.Object.
  • Ponadto typ podstawowy musi mieć konstruktor kopiujący. record typy zawsze mają konstruktor kopiujący.

Podstawowa deklaracja konstruktora

Kompilator emituje następujące błędy, gdy podstawowy konstruktor narusza co najmniej jedną regułę w konstruktorach podstawowych dla klas i struktur:

  • CS8861: Nieoczekiwana lista argumentów.
  • CS8862: Konstruktor zadeklarowany w typie z listą parametrów musi mieć inicjalizator konstruktora „this”.
  • 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.
  • 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, outlub in podstawowego 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.
  • 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.
  • 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ść ref lub out (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ść ref lub out (z wyjątkiem inicjatora init-only typu lub inicjatora zmiennej).
  • 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.
  • CS9122: Nieoczekiwana lista parametrów.
  • 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.
  • CS9136: Nie można użyć podstawowego parametru konstruktora typu wewnątrz elementu członkowskiego wystąpienia.

Podstawowe parametry konstruktora znajdują się w zakresie w treści tego typu. Kompilator może syntetyzować pole, które przechowuje parametr do użycia w elementach członkowskich lub inicjatorach pól. Ponieważ podstawowy parametr konstruktora może zostać skopiowany do pola, obowiązują następujące ograniczenia:

  • Konstruktory podstawowe można zadeklarować w typach struct i class, ale nie na typach interface.
  • Parametry podstawowego konstruktora nie mogą być używane w wywołaniu konstruktora base(), z wyjątkiem przypadku, gdy są częścią konstruktora podstawowego.
  • Podstawowe parametry konstruktora typu ref struct nie mogą być dostępne w wyrażeniach lambda, wyrażeniach zapytań lub funkcjach lokalnych.
  • Jeśli typ nie jest ref struct, nie można uzyskać dostępu do parametrów ref struct w elementach członkowskich instancji.
  • W typie ref struct podstawowe parametry konstruktora z modyfikatorami in, reflub out nie mogą być używane w żadnych metodach instancji ani akcesorach właściwości.

Typy struktur mają następujące dodatkowe ograniczenia dotyczące podstawowych parametrów konstruktora:

  • Nie można przechwycić podstawowych parametrów konstruktora w wyrażeniach lambda, wyrażeniach zapytań ani funkcjach lokalnych.
  • Nie można zwrócić podstawowych parametrów konstruktora przez odwołanie (ref return lub readonly ref return).

Typy struktur tylko do odczytu mają następujące dodatkowe ograniczenia dotyczące parametrów głównego konstruktora:

  • Parametry główne konstruktora i ich składowe nie mogą być ponownie przypisywane w strukturze readonly.
  • Podstawowe parametry konstruktora i ich składowe nie mogą być ref zwracane w readonly strukturze.
  • Podstawowe parametry konstruktora i ich składowe nie mogą być ref ani out argumentów do dowolnej metody.

We wszystkich tych przypadkach ograniczenia dotyczące podstawowych parametrów konstruktora są spójne z ograniczeniami dotyczącymi pól danych w tych typach. Ograniczenia są spowodowane tym, że podstawowy parametr konstruktora może zostać przekształcony w zsyntetyzowane pole w typie. Dlatego podstawowe parametry konstruktora muszą być zgodne z regułami, które mają zastosowanie do tego syntetyzowanego pola.

Konstruktor pochodny wywołuje konstruktor podstawowy, przekazując mu parametry. Należy użyć nazw parametrów z deklaracji konstruktora pochodnego.

Ostrzeżenia zawierają wskazówki dotyczące przechwyconych lub zablokowanych pierwotnych parametrów konstruktora.

  • CS9107: parametr jest przechwytywany do stanu otaczającego typu, a jego wartość jest również przekazywana do konstruktora podstawowego. Wartość może zostać również przechwycona przez klasę bazową. To ostrzeżenie wskazuje, że kod może zostać przydzielony dwie kopie podstawowego parametru konstruktora. Ponieważ parametr jest przekazywany do klasy bazowej, klasa bazowa prawdopodobnie go używa. Ponieważ klasa pochodna uzyskuje do niej dostęp, może mieć drugą kopię tego samego parametru. Ta dodatkowa przestrzeń do przechowywania może nie być zamierzona.
  • CS9113: parametr jest nieprzeczytany. To ostrzeżenie wskazuje, że klasa nigdy nie odwołuje się do konstruktora podstawowego, nawet aby przekazać go do podstawowego konstruktora podstawowego. Prawdopodobnie nie jest to potrzebne.
  • CS9124: parametr jest przechwytywany w stanie typu otaczającego, a jego wartość jest również używana do inicjowania pola, właściwości lub zdarzenia. To ostrzeżenie wskazuje, że parametr konstruktora typu zagnieżdżonego jest również przechwytywany przez typ otaczający. Parametr jest prawdopodobnie przechowywany dwa razy.
  • CS9179: Podstawowy parametr konstruktora jest przysłonięty przez członka z klasy bazowej