Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz 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:
- CS0071: Jawna implementacja interfejsu dla zdarzenia musi używać składni akcesora zdarzeń.
- CS0106: Modyfikator jest nieprawidłowy dla tego elementu.
- CS0277: Członek nie implementuje członka interfejsu, ponieważ nie jest publiczny.
- CS0425: Ograniczenia dla parametru typu metody muszą być zgodne z ograniczeniami dla parametru typu metody interfejsu. Rozważ użycie jawnej implementacji interfejsu.
- CS0460: Ograniczenia dotyczące zastępowania i jawnych metod implementacji interfejsu są dziedziczone z metody podstawowej, więc nie można ich określić bezpośrednio, z wyjątkiem ograniczenia "class" lub "struct".
- CS0470: Metoda nie może zaimplementować akcesora interfejsu dla typu. Użyj jawnej implementacji interfejsu.
- CS0473: Jawna implementacja interfejsu "nazwa metody" pasuje do więcej niż jednego członka interfejsu. Wybór członka interfejsu zależy od implementacji. Rozważ użycie implementacji niejawnej zamiast tego.
- CS0531: Członkowie interfejsu nie mogą mieć definicji.
- CS0535: Członek nie implementuje członka interfejsu.
- CS0538: Element członkowski w jawnej deklaracji interfejsu nie jest interfejsem.
- CS0539: Członek w jawnej deklaracji interfejsu nie znajduje się wśród członków interfejsu, które można zaimplementować.
- CS0540: Typ zawierający nie implementuje elementu interfejsu.
- CS0541: Jawna deklaracja interfejsu może być zadeklarowana tylko w klasie, rekordzie, strukturę lub interfejsie.
- CS0550: Element członkowski dodaje akcesor, który nie istnieje w elemencie interfejsu.
- CS0551: Jawna implementacja interfejsu jest pozbawiona akcesora.
- CS0630: Element członkowski nie może zaimplementować elementu członkowskiego interfejsu, ponieważ ma parametr __arglist.
- CS0686: Akcesor nie może zaimplementować elementu interfejsu. Użyj jawnej implementacji interfejsu.
- CS0736: Element nie implementuje elementu interfejsu instancji. Nie może zaimplementować elementu interfejsu, ponieważ jest statyczny.
- CS0737: Członek nie implementuje członka interfejsu. Nie można zaimplementować członka interfejsu, ponieważ nie jest publiczny.
- CS0738: Członek nie implementuje członka interfejsu. Nie może tego zrobić, ponieważ nie ma typu zwracanego, który pasuje.
- CS8705: Członek interfejsu nie ma najbardziej precyzyjnej implementacji. Żaden członek nie jest najbardziej precyzyjny.
- CS8854: Członek nie implementuje członka interfejsu.
- CS9333: Typ parametru musi być zgodny z zaimplementowanym członkiem.
- CS9334: Typ zwracany musi być zgodny z zaimplementowanym członem.
Deklaracja interfejsu i składnia
Następujące błędy odnoszą się do prawidłowej składni i struktury podczas deklarowania jawnych implementacji interfejsu:
- CS0071: Jawna implementacja zdarzenia zdefiniowanego w interfejsie musi używać składni akcesora zdarzeń.
- CS0106: Modyfikator jest nieprawidłowy dla tego elementu.
- CS0531: Członkowie interfejsu nie mogą mieć definicji.
- CS0538: Członek w jawnej deklaracji interfejsu nie jest interfejsem.
- CS0541: Jawna deklaracja interfejsu może być zadeklarowana tylko w klasie, rekordzie, strukturę lub interfejsie.
Te błędy można poprawić przy użyciu następujących technik:
- Podczas jawnego implementowania zdarzenia interfejsu (CS0071) należy ręcznie podać metody dostępu
addiremovezdarzenia. Kompilator nie generuje automatycznie tych metod dostępu dla jawnych implementacji interfejsu, dlatego należy je jawnie zdefiniować, aby określić sposób przechowywania zdarzenia i zarządzania nim. -
publicUsuń modyfikator z jawnych implementacji interfejsu (CS0106). Jawne implementacje interfejsu są domyślnie publiczne przy dostępie poprzez typ interfejsu, co sprawia, że zastosowanie słowa kluczowegopublicjest nadmiarowe i niedozwolone w tym kontekście. -
abstractUsuń modyfikator z jawnych implementacji interfejsu (CS0106). Implementacje interfejsu jawnego zapewniają rzeczywistą implementację i nie można ich oznaczyć jako abstrakcyjnych, ponieważ nie można ich zastąpić w klasach pochodnych. - Usuń treść metody z deklaracji składowych interfejsu lub przenieś implementację do klasy lub struktury, która implementuje interfejs (CS0531). Przed C# 8.0 członkowie interfejsu nie mogą zawierać implementacji; Począwszy od języka C# 8.0, można podać domyślne metody interfejsu przy użyciu określonej składni.
- Sprawdź, czy typ określony w deklaracji jawnego interfejsu jest rzeczywistym typem interfejsu (CS0538). Tylko typy interfejsów mogą być używane w jawnej składni implementacji interfejsu; próba użycia klasy lub innego typu innego niż interfejs narusza jawne reguły implementacji.
- Przenieś jawne deklaracje interfejsu do klasy lub struktury, która deklaruje interfejs na liście podstawowej (CS0541). Implementacje jawnego interfejsu muszą pojawiać się w treści klasy lub typu struktury i nie można ich zadeklarować na poziomie przestrzeni nazw lub w innych kontekstach.
Aby uzyskać więcej informacji, zobacz Interfejsy, Implementacja jawnego interfejsu i Jak zaimplementować zdarzenia interfejsu.
Zwracanie typów i podpisów
Następujące błędy występują, gdy podpis metody implementowania nie jest zgodny z deklaracją elementu członkowskiego interfejsu:
- CS0738: Członek nie implementuje członka interfejsu. Nie może tego zrobić, ponieważ nie ma pasującego typu zwracanego.
- CS8854: Członek nie implementuje członka interfejsu.
- CS9333: Typ parametru musi być zgodny z zaimplementowanym elementem.
- CS9334: Typ zwracany musi być zgodny z zaimplementowanym elementem.
Te błędy można poprawić przy użyciu następujących technik:
- Zmień typ zwracany metody implementowania, aby dokładnie pasował do typu zwracanego zadeklarowanego w elemencie członkowskim interfejsu (CS0738, CS9334). Podpis implementacji musi być dokładnie zgodny z deklaracją interfejsu, ponieważ podpis metody jest częścią kontraktu, który określa, który element członkowski interfejsu jest implementowany.
- Upewnij się, że typy parametrów w metodzie implementowania dokładnie odpowiadają typom parametrów zadeklarowanych w elemencie członkowskim interfejsu (CS9333). Każdy parametr musi mieć identyczny typ w tej samej pozycji co określona w deklaracji interfejsu, ponieważ typy parametrów są podstawowymi składnikami podpisu metody używanego przez kompilator do dopasowania implementacji do elementów członkowskich interfejsu.
- Dodaj metodę
initdostępu do właściwości implementującej, gdy właściwość interfejsu deklarujeinitsetter (CS8854). Słowo kluczoweinitpozwala na inicjowanie właściwości podczas konstruowania obiektu, uniemożliwiając późniejszą modyfikację, a implementowana właściwość musi zapewnić takie samo zachowanie, ograniczone tylko do inicjowania, aby spełnić kontrakt interfejsu.
Aby uzyskać więcej informacji, zobacz Interfejsy, Właściwości i Ustawienia tylko do inicjacji.
Brakujące lub niekompletne implementacje
Następujące błędy występują, gdy klasa nie może w pełni zaimplementować interfejsu lub implementuje elementy członkowskie, które nie są zgodne z kontraktem interfejsu:
- CS0535: Członek nie implementuje członka interfejsu.
- CS0550: Element członkowski dodaje element dostępu, który nie został znaleziony w elemencie członkowskim interfejsu.
- CS0551: Jawna implementacja interfejsu brakuje akcesora.
Te błędy można poprawić przy użyciu następujących technik:
- Podaj implementację dla każdego elementu członkowskiego zadeklarowanego w interfejsie lub zadeklaruj typ jako
abstract(CS0535). Każdy element członkowski musi zostać zaimplementowany w celu spełnienia wymagań interfejsu. - Usuń wszelkie metody dostępu z właściwości implementowania, które nie są zadeklarowane we właściwości interfejsu (CS0550). Właściwość implementowania może zawierać tylko metody dostępu jawnie zadeklarowane w definicji interfejsu, zapewniając, że implementacja nie dodaje funkcji poza tym, co określa kontrakt interfejsu.
- Dodaj wszystkie wymagane metody dostępu do implementacji interfejsu jawnego, aby dopasować deklarację interfejsu (CS0551). Każdy akcesor zadeklarowany w interfejsie musi mieć odpowiedni akcesor w implementacji z pasującymi sygnaturami, ponieważ implementacja musi spełnić pełny kontrakt akcesora zdefiniowany przez interfejs.
Aby uzyskać więcej informacji, zobacz Interfejsy i właściwości.
Dopasowywanie i rozwiązywanie kwestii członkostwa
Podczas próby zaimplementowania elementów członkowskich interfejsu, które nie istnieją w interfejsie, występują następujące błędy lub gdy typ zawierający nie deklaruje interfejsu:
- CS0539: Członek w jawnej deklaracji interfejsu nie znajduje się wśród członków interfejsu, które można zaimplementować.
- CS0540: Typ zawierający nie implementuje członka interfejsu.
Te błędy można poprawić przy użyciu następujących technik:
- Sprawdź, czy nazwa i podpis elementu członkowskiego w implementacji interfejsu jawnego dokładnie pasują do elementu członkowskiego zadeklarowanego w interfejsie lub usuń nieprawidłową implementację (CS0539). Element członkowski, który próbujesz zaimplementować, musi rzeczywiście istnieć w definicji interfejsu z zgodną nazwą, typem zwrotnym i typami parametrów, ponieważ implementacja jawnego interfejsu wymaga dokładnej korespondencji z kontraktem interfejsu.
- Dodaj interfejs do listy podstawowej klasy lub struktury lub usuń implementację interfejsu jawnego (CS0540). Typ może jawnie implementować tylko składniki interfejsów podane w jego liście dziedziczenia, więc typ implementujący musi zdefiniować relację z interfejsem, zanim będzie mógł zapewnić bezpośrednie implementacje.
Aby uzyskać więcej informacji, zobacz Interfejsy i Implementacja jawnego interfejsu.
Ograniczenia typu ogólnego
Podczas implementowania ogólnych metod interfejsu z ograniczeniami parametrów typu występują następujące błędy:
- CS0425: Ograniczenia dla parametru typu metody muszą być zgodne z ograniczeniami dla parametru typu metody interfejsu. Rozważ użycie jawnej implementacji interfejsu.
- CS0460: Ograniczenia dotyczące zastępowania i jawnych metod implementacji interfejsu są dziedziczone z metody podstawowej, więc nie można ich określić bezpośrednio, z wyjątkiem ograniczenia "class" lub "struct".
Te błędy można poprawić przy użyciu następujących technik:
- Upewnij się, że klauzula
wherew metodzie implementowania jest identyczna z deklaracją metody interfejsu lub pasuje do semantycznego znaczenia ograniczeń (CS0425). Ograniczenia parametru typu w implementacji muszą być zgodne z ograniczeniami zdefiniowanymi w interfejsie lub metodzie podstawowej. - Usuń jawne deklaracje ograniczeń z metod zastępowania oraz jawnej implementacji interfejsu (CS0460). Metoda zastąpienia dziedziczy swoje ograniczenia automatycznie z metody podstawowej lub interfejsu, dlatego ponowne deklarowanie ich jest nadmiarowe i niedozwolone z wyjątkiem określonych przypadków dozwolonych w języku C# 8 i nowszych.
- Zastosuj ograniczenie
defaultaby rozwiązać niejednoznaczności z typami referencji dopuszczającymi wartości null w implementacjach metod zastępujących i jawnych implementacjach interfejsu podczas używania języka C# 9 lub nowszego (CS0460). Wyjątek od reguły dziedziczenia ograniczeń pozwala na jawne określenie domyślnego ograniczenia, aby wyjaśnić konteksty adnotacji obsługujących wartość null. - Jawne określanie
where T : classlubwhere T : structograniczenia dla metod przesłaniania i jawnego implementowania interfejsu w przypadku używania języka C# 8 lub nowszego w celu włączenia adnotacji typów referencyjnych dopuszczających wartości null (CS0460). Te określone ograniczenia mogą obsługiwać analizę typu referencyjnego dopuszczającą wartość null dla parametrów typu ograniczonych do typów odwołań lub wartości.
Aby uzyskać więcej informacji, zobacz Ograniczenia dotyczące parametrów typu, Interfejsy i Rozszerzone typy referencyjne z wartością nullowe.
Widoczność i modyfikatory metod
Podczas implementowania metod interfejsu z nieprawidłowymi ułatwieniami dostępu lub modyfikatorami występują następujące błędy:
- CS0736: Członek nie implementuje członka interfejsu instancji. Nie może implementować członka interfejsu, ponieważ jest statyczny.
- CS0737: Członek nie implementuje członka interfejsu. Nie można zaimplementować członka interfejsu, ponieważ nie jest publiczny.
Te błędy można poprawić przy użyciu następujących technik:
-
staticUsuń modyfikator z deklaracji metody, która implementuje element członkowski interfejsu (CS0736). Przed C# 10 elementy interfejsu są elementami instancji, a nie statycznymi członkami. - Dodaj modyfikator dostępu
publicdo metody implementującej członka interfejsu (CS0737). Wszystkie elementy członkowskie interfejsu są niejawniepublic, ponieważ interfejsy definiują kontrakt na zachowanie publiczne, więc metoda implementująca musi mieć również publiczny dostęp, aby być dostępna za pośrednictwem odwołania do interfejsu.
Aby uzyskać więcej informacji, zobacz Interfejsy i modyfikatory dostępu.
Implementacja akcesora i konflikty
Podczas implementowania właściwości interfejsu lub zdarzeń z metodami dostępu (akcesorami), które mają problemy z widocznością lub konflikty nazewnictwa, mogą wystąpić następujące błędy:
- CS0277: Członek nie implementuje członka interfejsu, ponieważ nie jest publiczny.
- CS0470: Metoda nie może zaimplementować akcesora interfejsu dla typu. Użyj jawnej implementacji interfejsu.
- CS0686: Akcesor nie może zaimplementować członka interfejsu. Użyj jawnej implementacji interfejsu.
Te błędy można poprawić przy użyciu następujących technik:
- Usuń wszelkie modyfikatory dostępu z akcesorów właściwości, które ograniczają widoczność do poziomu widoczności niższego niż
public, lub dodaj modyfikatorpublic, jeśli brakuje (CS0277). Wszyscy członkowie interfejsu są niejawniepublic, więc implementujący akcesor również musi być publiczny, aby spełnić wymagania kontraktu interfejsu i być dostępny poprzez typ interfejsu. - Zastąp metody nazwami przypominającymi akcesory (na przykład
get_PropertyName) prawidłową składnią właściwości, używając implementacji jawnej interfejsu (CS0470). Kompilator generuje metody akcesorów wewnętrznie dla właściwości, a próba ręcznego tworzenia metod o tych zastrzeżonych nazwach powoduje konflikt z mechanizmem implementacji właściwości. - Użyj składni implementacji interfejsu jawnego, aby rozwiązać konflikty nazewnictwa, gdy interfejs zawiera nazwy metod, które pasują do metod dostępu generowanych automatycznie (CS0686). Kompilator automatycznie generuje metody takie jak
get_Propertyiset_Propertydla właściwości orazadd_Eventremove_Eventdla zdarzeń, więc jeśli interfejs deklaruje metody z tymi dokładnymi nazwami, jawna implementacja jest wymagana do uściślania między metodą interfejsu a akcesorem wygenerowanym przez kompilator.
Aby uzyskać więcej informacji, zobacz Interfejsy, Właściwości i Zdarzenia.
Niejednoznaczne i sprzeczne implementacje
Następujące błędy występują, gdy kompilator nie może określić, która implementacja interfejsu ma być używana:
- CS0473: Jawna implementacja interfejsu "nazwa metody" odpowiada więcej niż jednemu elementowi członkowskiemu interfejsu. Wybrany element członkowski interfejsu jest zależny od implementacji. Rozważ użycie niejawnej implementacji zamiast tego.
- CS8705: Element członkowski interfejsu nie ma najbardziej konkretnej implementacji. Żadna z nich nie jest najbardziej specyficzna.
Te błędy można poprawić przy użyciu następujących technik:
- Wyeliminuj implementację interfejsu jawnego i zamiast tego użyj jednej niejawnej implementacji publicznej dla obu metod interfejsu (CS0473). Gdy metoda ogólna uzyskuje ten sam podpis co metoda niegeneryczna (na przykład podczas implementowania
ITest<int>, gdzie obieTestMethod(int)iTestMethod(T)stają się identyczne), system metadanych infrastruktury języka wspólnego nie może jednoznacznie określić, który element członkowski interfejsu wiąże się z którym miejscem implementacji, więc użycie implementacji niejawnej umożliwia jednej metodzie spełnienie obu wymagań interfejsu. - Podaj jawną implementację w klasie implementacji lub struktury, która rozwiązuje niejednoznaczność między wieloma implementacjami domyślnymi (CS8705). Ten błąd występuje zazwyczaj w przypadku wzorców dziedziczenia diamentów, w których klasa implementuje wiele interfejsów, z których każda udostępnia domyślne implementacje dla tego samego elementu członkowskiego. Kompilator musi jawnie określić implementację do użycia lub udostępnić własną implementację.
- Zmień strukturę hierarchii interfejsów, aby uniknąć konfliktów dziedziczenia diamentowego, w których wiele interfejsów zapewnia domyślne implementacje dla tego samego członka (CS8705). Przeprojektując relacje interfejsu lub konsolidując domyślne implementacje w jednym interfejsie, można wyeliminować niejednoznaczność, która uniemożliwia kompilatorowi określenie najbardziej konkretnej implementacji.
Aby uzyskać więcej informacji, zobacz Interfejsy i domyślne metody interfejsu.
Specjalne ograniczenia implementacji
Następujący błąd występuje podczas używania specjalnych typów parametrów, które nie są zgodne z implementacją interfejsu:
- CS0630: Członek nie może zaimplementować członka interfejsu, ponieważ ma parametr __arglist.
Ten błąd można naprawić przy użyciu następujących technik:
-
__arglistUsuń parametr z metody implementowania (CS0630). Słowo__arglistkluczowe umożliwia metodom akceptowanie zmiennych liczb argumentów w sposób niezarządzany, ale ta funkcja jest niezgodna z implementacją interfejsu, ponieważ kontrakty interfejsu wymagają przewidywalnych, bezpiecznych podpisów typu, które można zweryfikować w czasie kompilacji. -
__arglistZastąpparamsparametr parametrem tablicy dla list argumentów o zmiennej długości (CS0630). W przeciwieństwie do__arglistkluczowe słowoparamszapewnia typ-bezpieczny mechanizm akceptowania zmiennych liczb argumentów, które są w pełni zgodne z implementacją interfejsu i zapewnia bezpieczeństwo typu podczas kompilacji wymagane przez interfejsy.
Aby uzyskać więcej informacji, zobacz Interfejsy i słowa kluczowe params.