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:
- CS0080: Ograniczenia nie są dozwolone w deklaracjach niegenerycznych.
- CS0081: Deklaracja parametru typu musi być identyfikatorem, który nie jest typem.
- CS0224: Metoda z vararg nie może być ogólna, być w typie ogólnym lub mieć parametr params.
-
CS0304: Nie można utworzyć wystąpienia typu zmiennej, ponieważ nie ma
new()ograniczenia. - CS0305: Użycie typu ogólnego wymaga argumentów typu N.
- CS0306: Typ może nie być używany jako argument typu.
- CS0307: Nie można używać identyfikatora z argumentami typu.
- CS0308: Nie można używać typu lub metody innej niż ogólne z argumentami typu.
- CS0310: Typ musi być typem nie abstrakcyjnym z publicznym konstruktorem bez parametrów, aby użyć go jako parametru w typie ogólnym lub metodzie.
-
CS0311: Typ nie może być użyty jako argument parametru typu
Tw typie uogólnionym lub metodzie. Brak niejawnej konwersji odwołania z „type1” na „type2”. - CS0312: Nie można użyć typu „type1” jako parametru typu w typie generycznym lub metodzie. Typ dopuszczający wartość null „type1” nie spełnia ograniczenia „constraint”.
- CS0313: Nie można użyć typu 'type1' jako parametru typu w typie generycznym lub metodzie. Typ dopuszczający wartość null 'type1' nie spełnia ograniczenia 'constraint'. Typy dopuszczające wartość null nie mogą spełniać żadnych ograniczeń interfejsowych.
- CS0314: Nie można użyć typu jako parametru typu w typie lub metodzie generycznej. Nie istnieje konwersja pakowania ani konwersja parametru typu z 'type' na 'constraint'.
-
CS0315: Nie można użyć typu jako parametru
Ttypu w typie ogólnym lub metodzie. Nie ma konwersji boksu z "type" na "ograniczenie". -
CS0401: Ograniczenie
new()musi być ostatnim ograniczeniem restrykcyjnym określonym. -
CS0403: Nie można przekonwertować wartości null na parametr typu, ponieważ może to być typ wartości niemogący być null. Rozważ użycie
default(T). - CS0405: Zduplikowane ograniczenie dla parametru typu.
- CS0406: Ograniczenie typu klasy "constraint" musi znajdować się przed wszelkimi innymi ograniczeniami.
- CS0409: Klauzula ograniczenia została już określona dla parametru typu "type parameter". Wszystkie ograniczenia parametru typu muszą być określone w jednej klauzuli where.
- CS0411: Nie można wywnioskować argumentów typu dla metody "method" z użycia. Spróbuj jawnie określić argumenty typu.
- CS0412: Parametr: parametr, zmienna lokalna lub funkcja lokalna nie może mieć takiej samej nazwy jak parametr typu metody.
-
CS0413: Nie można użyć parametru typu z operatorem
as, ponieważ nie ma ograniczenia typu klasy aniclassograniczenia. - CS0417: Identyfikator: nie można podać argumentów podczas tworzenia wystąpienia typu zmiennej.
-
CS0449:
classOgraniczenia , ,structunmanaged,notnullidefaultnie mogą być łączone ani duplikowane i muszą być określone jako pierwsze na liście ograniczeń. -
CS0450: Parametr typu: nie można określić zarówno klasy ograniczenia, jak
classlubstructjako ograniczenia. -
CS0451: Ograniczenia
new()nie można używać z ograniczeniemstruct. - CS0452: Typ „nazwa typu” musi być typem referencyjnym, aby można było użyć go jako parametru „nazwa parametru” w typie generycznym lub metodzie „generic”.
- CS0453: Typ „type name” musi być nienullowalnym typem wartości, aby można go było użyć jako parametru „parameter name” w typie generycznym lub metodzie „generic”.
- CS0454: Cykliczna zależność ograniczeń obejmująca parametr typu 1 i parametr typu 2.
- CS0455: Parametr typu dziedziczy sprzeczne ograniczenia "constraint1" i "constraint2".
- CS0456: Typ parametru "typ parametr 1" ma ograniczenie "struktura", więc "parametr typu 1" nie może być używany jako ograniczenie dla parametru typu 2.
- CS0693: Typ parametru "type parameter" ma taką samą nazwę jak parametr typu z typu zewnętrznego "type".
- CS0694: Parametr typu ma taką samą nazwę jak typ zawierający lub metoda.
- CS0695: "type" nie może zaimplementować zarówno "interface1" i "interface2", ponieważ mogą one ujednolicić dla niektórych typów podstawień parametrów.
- CS0698: Typ ogólny nie może pochodzić z typu, ponieważ jest to klasa atrybutów.
- CS0699: "generic" nie definiuje parametru typu "identifier".
- CS0701: "identyfikator" nie jest prawidłowym ograniczeniem. Typ używany jako ograniczenie musi być interfejsem, klasą nie zapieczętowaną lub parametrem typu.
- CS0702: Ograniczenie nie może być klasą specjalną.
- CS0703: Niespójne ułatwienia dostępu: typ ograniczenia jest mniej dostępny niż deklaracja.
- CS0704: Nie można wykonać wyszukiwania składowej niewirtualnej w elemencie „type”, ponieważ jest to parametr typu.
- CS0706: Nieprawidłowy typ ograniczenia. Typ używany jako ograniczenie musi być interfejsem, klasą nie zapieczętowaną lub parametrem typu.
- CS0717: Klasa statyczna: klasy statyczne nie mogą być używane jako ograniczenia.
- CS0718: "type": typy statyczne nie mogą być używane jako argumenty typu.
- CS1720: Wyrażenie zawsze spowoduje wyjątek System.NullReferenceException, ponieważ domyślna wartość typu ogólnego ma wartość null.
- CS1763: "parametr" jest typu "type". Domyślna wartość parametru typu odwołania innego niż ciąg może być inicjowana tylko z wartością null.
- CS1948: Zmienna zakresu "name" nie może mieć takiej samej nazwy jak parametr typu metody.
- CS1960: Nieprawidłowy modyfikator wariancji. Jako wariant można określić tylko parametry interfejsu i typu delegata.
- CS1961: Nieprawidłowa wariancja: parametr typu musi być kowariantnie prawidłowy dla "type". Parametr "type" jest kontrawariantny.
- CS3024: Typ ograniczenia "type" nie jest zgodny ze specyfikacją CLS.
- CS7002: Nieoczekiwane użycie nazwy ogólnej.
- CS8322: Nie można przekazać argumentu typu dynamicznego do ogólnej funkcji lokalnej z wywnioskowanym argumentami typu.
- CS8375: Ograniczenie "new()" nie może być używane z ograniczeniem "niezarządzanym".
- CS8377: Typ „type” musi być nienullowalnym typem wartości wraz ze wszystkimi polami na dowolnym poziomie zagnieżdżenia, aby można było użyć go jako parametru „parameter” w typie generycznym lub metodzie „generic”.
- CS8379: Typ parametru "typ parametr 1" ma ograniczenie "niezarządzane", więc "parametr typu 1" nie może być używany jako ograniczenie dla parametru "type 2".
- CS8380: "type": nie można określić zarówno klasy ograniczenia, jak i ograniczenia "niezarządzane".
- CS8387: Typ parametru "type parameter" ma taką samą nazwę jak parametr typu z metody zewnętrznej "method".
- CS8389: pominięcie argumentu typu nie jest dozwolone w bieżącym kontekście.
- CS8427: Wyliczenia, klasy i struktury nie mogą być deklarowane w interfejsie, który ma parametr typu "in" lub "out".
- CS8665: Metoda "method" określa ograniczenie "class" dla parametru typu "type parameter", ale odpowiadający mu parametr typu "type parameter" przesłoniętej lub jawnie zaimplementowanej metody "method" nie jest typem odwołania.
- CS8666: Metoda „method” określa ograniczenie „struct” dla parametru typu „type parameter”, ale odpowiadający mu parametr typu „type parameter” przesłoniętej lub jawnie zaimplementowanej metody „method” nie jest typem wartości niedopuszczającym wartości null.
- CS8822: Metoda "method" określa ograniczenie "default" dla parametru typu "type parameter", ale odpowiadający mu parametr typu "type parametr" przesłoniętej lub jawnie zaimplementowanej metody "method" jest ograniczony do typu odwołania lub typu wartości.
- CS8823: Ograniczenie "domyślne" jest prawidłowe tylko w przypadku zastępowania i jawnych metod implementacji interfejsu.
- CS8893: 'type' nie jest prawidłowym typem konwencji wywołania dla elementu „UnmanagedCallersOnly”.
- CS8894: Nie można użyć elementu „type” jako typu parametru lub typu zwracanego w metodzie oznaczonej atrybutem „UnmanagedCallersOnly”.
- CS8895: Metody przypisane "UnmanagedCallersOnly" nie mogą mieć ogólnych parametrów typu i nie mogą być deklarowane w typie ogólnym.
- CS8896: "UnmanagedCallersOnly" można stosować tylko do zwykłych statycznych nie abstrakcyjnych, niewirtuaicznych metod lub statycznych funkcji lokalnych.
-
CS9011: Słowo kluczowe
delegatenie może być używane jako ograniczenie. Czy masz na myśliSystem.Delegate? -
CS9012: Nieoczekiwane słowo kluczowe
record. Czy chodziło orecord structlubrecord class? - CS9338: Niespójne ułatwienia dostępu: typ jest mniej dostępny niż klasa.
Deklaracja parametru typu i nazewnictwo
- CS0080: Ograniczenia nie są dozwolone w deklaracjach niegenerycznych.
- CS0081: Deklaracja parametru typu musi być identyfikatorem, który nie jest typem.
- CS0412: Parametr: parametr, zmienna lokalna lub funkcja lokalna nie może mieć takiej samej nazwy jak parametr typu metody.
- CS0693: Parametr typu „type parameter” ma taką samą nazwę jak parametr typu w typie zewnętrznym „type”.
- CS0694: Parametr typu ma taką samą nazwę jak typ zawierający lub metoda.
- CS0699: "generic" nie definiuje parametru typu "identifier".
- CS1948: Zmienna zakresu "name" nie może mieć takiej samej nazwy jak parametr typu metody.
- CS8387: Typ parametru "type parameter" ma taką samą nazwę jak parametr typu z metody zewnętrznej "method".
-
CS9012: Nieoczekiwane słowo kluczowe
record. Czy chodziło orecord structlubrecord class?
Te błędy odnoszą się do sposobu deklarowania i nazywania parametrów typu w typach ogólnych i metodach. Nazwy parametrów typu muszą być prawidłowymi identyfikatorami, nie mogą powodować konfliktu z innymi identyfikatorami w zakresie i muszą być wyświetlane na liście parametrów typu deklaracji.
- Usuń klauzulę ograniczenia z deklaracji niegenerycznych (CS0080). Klauzulę
wheremożna używać tylko w typach ogólnych i metodach, które deklarują parametry typu. Jeśli musisz zastosować ograniczenia, najpierw dodaj parametry typu do deklaracji typu lub metody. - Zastąp rzeczywiste nazwy typów identyfikatorami w deklaracjach parametrów typu (CS0081). Należy zadeklarować parametry typu przy użyciu identyfikatorów (takich jak ,
Tlub ) zamiast konkretnych typów (takich jakTKeyTValuelubintstring). Celem parametru typu jest służyć jako symbol zastępczy, który kompilator zastępuje rzeczywistymi typami, gdy używany jest typ ogólny lub metoda. - Zmień nazwę parametrów typu, zmiennych lokalnych, parametrów lub zmiennych zakresu, aby uniknąć konfliktów nazewnictwa (CS0412, CS0694, CS1948). Nazwy parametrów typu nie mogą przesłaniać identyfikatorów w tym samym zakresie i nie mogą mieć takiej samej nazwy jak otaczający typ lub metoda. Zmienne zakresu LINQ nie mogą również używać ponownie nazwy parametru typu metody. Takie konflikty prowadzą do niejasności dotyczących tego, który identyfikator jest przywoływany.
- Użyj innej nazwy dla parametrów typu wewnętrznego, które cieniują zewnętrzne (CS0693, CS8387). Gdy składowa ogólna (taka jak metoda lub typ zagnieżdżony) znajduje się wewnątrz klasy ogólnej lub metody, parametr typu wewnętrznego nie musi być taki sam jak typ zewnętrzny. Nadanie im tej samej nazwy wprowadza niejasność co do tego, do którego parametru typu odnosi się odwołanie. Użyj odrębnej nazwy dla parametru typu wewnętrznego.
- Upewnij się, że wszystkie parametry typu w klauzulach ograniczeń są deklarowane na liście parametrów typu (CS0699). Klauzula
wheremoże odwoływać się tylko do parametrów typu wyświetlanych w deklaracji ogólnej. Jeśli nazwa w klauzuliwherenie odpowiada żadnemu zadeklarowanemu parametrowi typu, sprawdź, czy nie ma literówek lub błędów w pisowni. - Użyj poprawnej składni deklaracji rekordu (CS9012). Podczas deklarowania typu rekordu należy użyć
record classlubrecord struct(lub tylkorecorddla typu referencyjnego). Samo słowo kluczowerecordnie może występować w miejscach, w których kompilator oczekuje innej składni deklaracji.
Aby uzyskać więcej informacji, zobacz Ogólne parametry typu i typy ogólne.
Deklaracja ograniczeń i kolejność
-
CS0401: Ograniczenie
new()musi być ostatnim ograniczeniem restrykcyjnym określonym. - CS0406: Ograniczenie typu klasy "constraint" musi znajdować się przed wszelkimi innymi ograniczeniami.
- CS0409: Klauzula ograniczenia została już określona dla parametru typu "type parameter". Wszystkie ograniczenia parametru typu muszą być określone w jednej klauzuli where.
-
CS0449:
classOgraniczenia , ,structunmanaged,notnullidefaultnie mogą być łączone ani duplikowane i muszą być określone jako pierwsze na liście ograniczeń. -
CS0450: Nie można określić zarówno klasy jako ograniczenia, jak i ograniczeń
classlubstructdla parametru typu. -
CS0451: Ograniczenie
new()nie może być używane z ograniczeniemstruct. - CS8375: Ograniczenie "new()" nie może być używane z ograniczeniem "niezarządzanym".
- CS8380: "type": nie można określić zarówno klasy ograniczenia, jak i ograniczenia "niezarządzane".
-
CS9011: Słowo kluczowe
delegatenie może być używane jako ograniczenie. Czy masz na myśliSystem.Delegate?
Ograniczenia dotyczące parametrów typu muszą być zgodne z określoną kolejnością: najpierw występują ograniczenia podstawowe (class, struct, , unmanagednotnulllub default), a następnie ograniczenie typu klasy, a następnie ograniczenia interfejsunew(), a na koniec ograniczenie konstruktora. Niektóre ograniczenia wykluczają się wzajemnie i nie można ich łączyć. Wszystkie ograniczenia dla pojedynczego parametru typu muszą pojawić się w jednej where klauzuli.
-
new()Umieść ograniczenie na końcu listy ograniczeń (CS0401). Ograniczenienew()musi pojawić się po wszystkich innych ograniczeniach. Na przykład zmień wartośćwhere T : new(), IDisposablenawhere T : IDisposable, new(). - Umieść ograniczenie typu klasy przed ograniczeniami interfejsu (CS0406). Po ograniczeniu parametru typu do określonej klasy bazowej wraz z interfejsami klasa musi pojawić się jako pierwsza. Na przykład zmień wartość
where T : IDisposable, MyBaseClassnawhere T : MyBaseClass, IDisposable. - Połącz wszystkie ograniczenia dla parametru typu w jedną
whereklauzulę (CS0409). Nie można użyć wieluwhereklauzul dla tego samego parametru typu. Scal je w jedną klauzulę: zmień nawhere T : I where T : new()where T : I, new(). Wielewhereklauzul jest prawidłowych tylko wtedy, gdy są przeznaczone dla różnych parametrów typu. - Najpierw należy umieścić podstawowe ograniczenia i nie łączyć wzajemnie wykluczających się ograniczeń (CS0449). Można określić co najwyżej jedną z wartości
class,struct,unmanaged,notnulllubdefault, i musi być wyświetlana jako pierwsza na liście ograniczeń. Ograniczeniaclassistructwykluczają się wzajemnie, podobnie jak iclassunmanaged. - Nie łącz określonego ograniczenia klasy z
class,structlubunmanaged(CS0450, CS8380). Jeśli parametr typu jest ograniczony do określonego typu klasy, jest niejawnie typem referencyjnym, co jest sprzeczne z ograniczeniemstructlubunmanaged. Usuń ograniczenie klasy lub ograniczenie podstawowe. - Nie należy łączyć
new()zstructaniunmanaged(CS0451, CS8375). Wszystkie typy wartości mają niejawnie zdefiniowany publiczny konstruktor bez parametrów, więc ograniczenienew()jest nadmiarowe w połączeniu zstruct. To samo dotyczyunmanaged, co implikujestruct.new()Usuń ograniczenie. - Zastąp ciąg
delegateciągiemSystem.Delegatew klauzulach ograniczeń (CS9011). Słowodelegatekluczowe jest używane do deklarowania typów delegatów, a nie jako ograniczenia. Aby ograniczyć parametr typu do delegowania typów, użyjSystem.Delegatejako typu ograniczenia.
Aby uzyskać więcej informacji, zobacz Ograniczenia dotyczące parametrów typu.
Prawidłowe typy ograniczeń
- CS0405: Zduplikowane ograniczenie dla parametru typu.
- CS0701: "identyfikator" nie jest prawidłowym ograniczeniem. Typ używany jako ograniczenie musi być interfejsem, klasą nie zapieczętowaną lub parametrem typu.
- CS0702: Ograniczenie nie może być klasą specjalną.
- CS0703: Niespójna dostępność: typ ograniczenia jest mniej dostępny niż deklaracja.
- CS0706: Nieprawidłowy typ ograniczenia. Typ używany jako ograniczenie musi być interfejsem, klasą nie zapieczętowaną lub parametrem typu.
- CS0717: Klasa statyczna: klasy statyczne nie mogą być używane jako ograniczenia.
- CS3024: Typ ograniczenia "type" nie jest zgodny ze specyfikacją CLS.
Ograniczenie musi być interfejsem, klasą nie zapieczętowaną lub parametrem typu. Niektóre typy są nieprawidłowe jako ograniczenia ze względu na ich specjalne znaczenie w systemie typów platformy .NET lub dlatego, że nie można ich dziedziczyć.
- Usuń zduplikowane ograniczenia (CS0405). Każde ograniczenie może być wyświetlane tylko raz w klauzuli ograniczenia. Jeśli masz plik
where T : I, I, usuń duplikat. - Użyj tylko typów nieprzytieczętowanych jako ograniczeń (CS0701). Zapieczętowane klasy, struktury i wyliczenia nie mogą być dziedziczone, dlatego nie służą one jako ograniczenia. Użyj interfejsu implementowanego przez żądane typy lub użyj niezaplombowanej klasy bazowej.
- Nie używaj klas specjalnych jako ograniczeń (CS0702). Typy Object, Arrayi ValueType nie mogą być używane jako ograniczenia. Każdy typ już pochodzi z
Object, więc ograniczenie do niego nie zapewnia żadnej wartości.ArrayiValueTypesą abstrakcyjnymi typami bazowymi, których nie można bezpośrednio dziedziczyć. Jeśli potrzebujesz zachowania przypominającego tablicę, użyj poleceniaIList<T>lubIEnumerable<T>zamiast tego. - Upewnij się, że typy ograniczeń są co najmniej tak dostępne jak typ ogólny (CS0703). Publiczny typ ogólny nie może mieć ograniczeń przy użyciu typów wewnętrznych, ponieważ kod zewnętrzny nie może podać prawidłowych argumentów typu. Ustaw typ ograniczenia jako publiczny lub zmniejsz dostępność typu ogólnego.
- Należy używać tylko interfejsów, niezapieczętowanych klas lub parametrów typu jako ograniczenia (CS0706). Nie można używać tablic, zamkniętych klas, struktur, wyliczeń ani innych nieprawidłowych typów jako ograniczeń. Rozważ użycie interfejsu implementowanego przez żądane typy.
- Nie używaj klas statycznych jako ograniczeń (CS0717). Nie można rozszerzyć klas statycznych, ponieważ zawierają tylko statyczne elementy członkowskie. Żaden typ nie może pochodzić z klasy statycznej, co czyni go bezużytecznym jako ograniczeniem.
- Użyj typu zgodnego ze specyfikacją CLS dla ograniczenia typu (CS3024). Gdy zestaw jest oznaczony symbolem
[assembly: CLSCompliant(true)], użycie typu niezgodnego ze specyfikacją CLS jako ograniczenia typu generycznego może uniemożliwić kodowi napisanemu w niektórych językach korzystanie z klasy generycznej.
Aby uzyskać więcej informacji, zobacz Ograniczenia dotyczące parametrów typu.
Ograniczenie zadowolenia i konwersji
-
CS0311: Nie można użyć typu jako parametru typu
Tw typie lub metodzie ogólnej. Nie istnieje niejawna konwersja referencji z „type1” na „type2”. - CS0312: Nie można użyć tego typu jako parametru typu w typie generycznym lub metodzie. Typ dopuszczający wartość null nie spełnia ograniczenia „constraint”.
- CS0313: Nie można użyć tego typu jako parametru typu w typie lub metodzie generycznej. Typ dopuszczający wartość null nie spełnia ograniczenia „constraint”. Typy dopuszczające wartość null nie mogą spełniać żadnych ograniczeń interfejsów.
- CS0314: Nie można użyć typu jako parametru typu w typie sparametryzowanym lub metodzie. Nie istnieje konwersja pakowania ani konwersja parametru typu z 'type' na 'constraint'.
-
CS0315: Nie można użyć typu jako parametru
Ttypu w typie ogólnym lub metodzie. Nie ma konwersji boksu z "type" na "ograniczenie". - CS0452: Typ „type name” musi być typem referencyjnym, aby można było użyć go jako parametru „parameter name” w generycznym typie lub metodzie „generic”.
- CS0453: Typ "nazwa typu" musi być typem wartości innej niż null, aby użyć go jako parametru "nazwa parametru" w typie ogólnym lub metodzie "generic".
- CS8377: Typ „type” musi być typem wartościowym, który nie dopuszcza wartości null, łącznie ze wszystkimi polami na każdym poziomie zagnieżdżenia, aby użyć go jako parametru „parameter” w typie lub metodzie generycznej „generic”.
Te błędy występują, gdy argument typu nie spełnia ograniczeń zadeklarowanych dla parametru typu ogólnego. Argument typu musi mieć poprawne konwersje, relacje dziedziczenia i właściwości strukturalne, aby dopasować je do wszystkich ograniczeń.
- Zmień argument typu na taki, który ma niejawną konwersję odwołania do typu ograniczenia (CS0311). Jeśli parametr typu ma ograniczenie, takie jak
where T : BaseType, każdy argument typu musi być konwertowany naBaseTypeza pomocą niejawnej konwersji odwołania lub konwersji tożsamości. Niejawne konwersje liczbowe (takie jak zshortdoint) nie spełniają ogólnych ograniczeń parametrów typu. - Użyj typów wartości innych niż null lub zmień typ ograniczenia (CS0312, CS0313). Typy wartości dopuszczające null (takie jak
int?) różnią się od swoich bazowych typów wartości i nie spełniają tych samych ograniczeń. Typy wartości dopuszczające wartość null nie mogą spełniać ograniczeń dotyczących interfejsu, ponieważ samo opakowanie dopuszczające wartość null nie implementuje interfejsu. Użyj niepustej formy typu wartości jako argumentu typu typu. - Powtórz ograniczenia parametrów typu klasy bazowej w dowolnej deklaracji klasy pochodnej (CS0314). Gdy pochodna klasa ogólna dziedziczy z ograniczonej klasy ogólnej podstawowej, klasa pochodna musi zadeklarować te same ograniczenia dla odpowiednich parametrów typu.
- Upewnij się, że argumenty typu spełniają ograniczenia typu referencyjnego lub ograniczenia klasy (CS0315). Jeśli parametr typu jest ograniczony do typu klasy, nie można użyć typu wartości (struktury) jako argumentu typu, ponieważ nie ma konwersji boxing, która spełnia relację ograniczenia. Użyj typu odwołania, który dziedziczy z lub implementuje ograniczenie.
- Użyj typu referencyjnego jako argumentu typu, gdy określono ograniczenie
class(CS0452). Typy wartości, takie jakstructlubintnie mogą spełniaćclassograniczenia. Zmień argument typu na typ referencyjny albo usuń ograniczenieclass, jeśli typ ogólny może działać z typami wartości. - Użyj niepustego typu wartościowego jako argumentu typu, gdy określono ograniczenie
struct(CS0453). Typy referencyjne, typy wartości dopuszczające wartość null (int?) oraz inne typy niebędące typami wartości nie mogą spełniać ograniczeniastruct. Użyj konkretnego typu wartości, który nie dopuszcza wartości null, takiego jakint,doublelub typustructzdefiniowanego przez użytkownika. - Użyj typu, którego wszystkie pola są typami niezarządzanymi, gdy określono ograniczenie
unmanaged(CS8377). Ograniczenieunmanagedwymaga typu wartości innej niż null, w której każde pole na każdym poziomie zagnieżdżania jest również typem niezarządzanym. Typy zawierające pola typu odwołania lub parametry typu ogólnego, które nie są znane jako niezarządzane, nie spełniają tego ograniczenia.
Aby uzyskać więcej informacji, zobacz Ograniczenia dotyczące parametrów typu.
Konflikty ograniczeń i zależności cykliczne
- CS0454: Cykliczna zależność ograniczeń obejmująca parametr typu 1 i parametr typu 2.
- CS0455: Parametr typu dziedziczy sprzeczne ograniczenia "constraint1" i "constraint2".
- CS0456: Typ parametru "typ parametr 1" ma ograniczenie "struktura", więc "parametr typu 1" nie może być używany jako ograniczenie dla parametru typu 2.
- CS8379: Typ parametru "typ parametr 1" ma ograniczenie "niezarządzane", więc "parametr typu 1" nie może być używany jako ograniczenie dla parametru "type 2".
Ograniczenia nie mogą tworzyć zależności cyklicznych, a parametry typu nie mogą dziedziczyć ograniczeń, które wprowadzają konflikt i których nie da się spełnić jednocześnie. Ograniczenia typu wartości (struct i unmanaged) są niejawnie zapieczętowane, więc nie mogą być używane jako ograniczenia dla innych parametrów typu.
- Usuń zależności ograniczeń cyklicznych (CS0454). Parametr typu nie może bezpośrednio lub pośrednio zależeć od siebie przez jego ograniczenia. Na przykład
where T : U where U : Ttworzy zależność cykliczną. Przerwij cykl, usuwając jedno z ograniczeń. - Usuń konfliktowe ograniczenia dziedziczone (CS0455). Nie można ograniczyć parametru typu do wielu niepowiązanych klas, ponieważ język C# nie obsługuje dziedziczenia wielu klas. Podobnie nie można go ograniczyć jednocześnie do
structi typu klasy. Zmień strukturę hierarchii typów lub usuń jedną z ograniczeń powodujących konflikt. - Nie używaj parametru typu z ograniczeniem
structani parametru typu z ograniczeniemunmanagedjako ograniczenia innego parametru typu (CS0456, CS8379). Ograniczenia typu wartości są niejawnie zapieczętowane, więc żaden inny typ nie może pochodzić z nich. Aby rozwiązać ten błąd, należy umieścić typ wartości lub ograniczenie niezarządzane bezpośrednio na drugim parametrze typu zamiast ograniczać go pośrednio za pomocą pierwszego parametru typu.
Aby uzyskać więcej informacji, zobacz Ograniczenia dotyczące parametrów typu.
Reguły nadpisywania i implementacji ograniczeń
- CS8665: Metoda "method" określa ograniczenie "class" dla parametru typu "type parameter", ale odpowiadający mu parametr typu "type parameter" przesłoniętej lub jawnie zaimplementowanej metody "method" nie jest typem odwołania.
- CS8666: Metoda „method” określa ograniczenie „struct” dla parametru typu „type parameter”, ale odpowiadający parametr typu „type parameter” przesłanianej lub jawnie implementowanej metody „method” nie jest typem wartości, który nie dopuszcza wartości null.
- CS8822: Metoda „method” określa ograniczenie „default” dla parametru typu „type parameter”, ale odpowiadający parametr typu „type parameter” przesłanianej lub jawnie implementowanej metody „method” jest ograniczony do typu referencyjnego lub typu wartościowego.
- CS8823: Ograniczenie "domyślne" jest prawidłowe tylko w przypadku zastępowania i jawnych metod implementacji interfejsu.
Jeśli zastąpisz metodę wirtualną lub jawnie zaimplementujesz metodę interfejsu, ograniczenia dotyczące parametrów typu metody zastępowania muszą być zgodne z ograniczeniami metody podstawowej. Ograniczenie default jest specjalnym modyfikatorem używanym tylko w scenariuszach przesłaniania i jawnej implementacji interfejsu, aby wskazać, że parametr typu nie ma ani ograniczenia class, ani struct.
- Upewnij się, że ograniczenia metody zastępowania są zgodne z ograniczeniami metody podstawowej (CS8665, CS8666). Przesłonięcie nie może dodawać ograniczenia
class, jeśli odpowiadający mu parametr typu metody bazowej nie jest ograniczony do typu referencyjnego. Podobnie nie może dodaćstructograniczenia, jeśli parametr typu metody bazowej nie jest ograniczony do typu wartości. Przesłonięcie musi być zgodne z deklaracją bazową. -
defaultOgraniczeń należy używać tylko wtedy, gdy parametr typu metody bazowej nie jest ograniczony (CS8822). Ograniczeniedefaultwskazuje, że parametr typu nie ma ograniczeniaclassanistruct. Nie można zastosowaćdefault, jeśli odpowiadający parametr typu w przesłanianej metodzie ma już ograniczenieclasslubstruct. - Ograniczenia
defaultnależy używać tylko w metodach przesłanianych lub metodach jawnej implementacji interfejsu (CS8823). Ograniczeniedefaultnie jest prawidłowe w regularnych deklaracjach metod. Służy ona w szczególności do usunięcia niejednoznaczności podczas przesłaniania metody, gdy metoda bazowa miała parametr typu bez ograniczeń i trzeba wskazać, że przesłonięcie również pozostawia go bez ograniczeń.
Aby uzyskać więcej informacji, zobacz Ograniczenia dotyczące parametrów typu i default ograniczenia.
Ograniczenia konstruktora
-
CS0304: Nie można utworzyć wystąpienia typu zmiennej, ponieważ nie ma
new()ograniczenia. - CS0310: Typ musi być typem nie abstrakcyjnym z publicznym konstruktorem bez parametrów, aby użyć go jako parametru w typie ogólnym lub metodzie.
- CS0417: Identyfikator: nie można podać argumentów podczas tworzenia wystąpienia typu zmiennej.
Te błędy odnoszą się do ograniczenia new() oraz tworzenia instancji parametrów typu za pomocą operatora new.
-
new()Dodaj ograniczenie do parametrów typu, które należy utworzyć (CS0304). Jeśli używasznew T()wewnątrz typu ogólnego lub metody, kompilator musi zagwarantować, że dowolny argument typu ma konstruktor bez parametrów. Ograniczenienew()zapewnia tę gwarancję. - Upewnij się, że argumenty typu mają publiczne konstruktory bez parametrów (CS0310). Jeśli parametr typu ma ograniczenie
new(), każdy typ konkretny używany jako argument typu musi być nieabstrakcyjny i musi mieć publiczny konstruktor bezparametrowy. Typy z tylko prywatnymi, chronionymi lub sparametryzowanymi konstruktorami nie mogą spełniaćnew()ograniczeń. - Usuń argumenty konstruktora podczas tworzenia wystąpień parametrów typu (CS0417). Ograniczenie
new()gwarantuje tylko konstruktor bez parametrów. Nie można przekazać argumentów donew T(arguments). Jeśli musisz utworzyć wystąpienia z określonymi argumentami, rozważ użycie wzorca fabryki lub ograniczenia interfejsu definiującego zachowanie konstrukcji.
Aby uzyskać więcej informacji, zobacz Ograniczenia dotyczące parametrów typu i new() ograniczenia.
Wpisz liczbę argumentów i użycie
- CS0224: Metoda z vararg nie może być ogólna, być w typie ogólnym lub mieć parametr params.
- CS0305: Użycie typu ogólnego wymaga argumentów typu N.
- CS0306: Typ może nie być używany jako argument typu.
- CS0307: Nie można używać identyfikatora z argumentami typu.
- CS0308: Nie można używać nieogólnego typu ani metody z argumentami typu.
- CS7002: Nieoczekiwane użycie nazwy ogólnej.
- CS8389: pominięcie argumentu typu nie jest dozwolone w bieżącym kontekście.
Te błędy odnoszą się do dostarczania poprawnej liczby i typu argumentów typom ogólnym i metodom.
- Usuń ogólne parametry typu lub zawierające deklaracje typów ogólnych z metod, które używają
__arglist(CS0224). Słowo kluczowe__arglistjest niezgodne z typami generycznymi, ponieważ mechanizmy wykonawcze do obsługi list zmiennych argumentów powodują konflikt z wymaganą dla parametrów typów generycznych substytucją typu. - Podaj dokładną liczbę argumentów typu określonych w deklaracji ogólnej (CS0305). Każdy parametr typu generycznego w definicji musi mieć odpowiadający mu argument typu podczas tworzenia wystąpienia typu generycznego.
- Użyj tylko prawidłowych typów jako argumentów typu (CS0306). Nie można używać typów wskaźnikowych (takich jak
int*lubchar*) jako argumentów typu, ponieważ typy generyczne wymagają typów zarządzanych, które mogą być śledzone przez moduł odśmiecający. - Usuń składnię argumentu typu z konstrukcji niegenerycznych (CS0307, CS0308). Argumenty typu ujęte w nawiasy kątowe można stosować tylko do typów ogólnych i metod deklarujących parametry typu. Upewnij się, że zaimportowaliśmy przestrzeń nazw zawierającą ogólną wersję typu.
- Usuń parametry typu z deklaracji, które nie obsługują typów ogólnych (CS7002). Niektóre konstrukcje, takie jak wyliczenia, nie mogą być ogólne. Jeśli potrzebujesz ogólnego kontenera na wartości wyliczeniowe, rozważ użycie klasy ogólnej lub struktury zamiast tego.
- Podaj jawnie wszystkie wymagane argumenty typu (CS8389). W niektórych kontekstach, takich jak używanie
typeofoperatora lub tworzenie delegatów, należy podać wszystkie argumenty typu i nie można ich pominąć. Na przykładtypeof(List<int>)zamiast próbować pominąć argument typu.
Aby uzyskać więcej informacji, zobacz Ogólne parametry typu i typy ogólne.
Wnioskowanie typów argumentów
- CS0411: Nie można wywnioskować argumentów typu dla metody "method" z użycia. Spróbuj jawnie określić argumenty typu.
Ten błąd występuje, gdy wywołujesz metodę ogólną bez jawnego podawania argumentów typu, a kompilator nie może wywnioskować, które argumenty typu mają być określone. Kompilator wnioskuje argumenty typu na podstawie typów argumentów metody przekazywanych w miejscu wywołania.
- Określ argumenty typu jawnie w nawiasach kątowych (CS0411). Jeśli kompilator nie może określić argumentów typu z argumentów metody, podaj je bezpośrednio. Na przykład zmień wartość
G()naG<int>(). Ten błąd występuje często, gdy metoda ogólna nie ma parametrów, z których ma wywnioskować typ, lub gdynullargument jest przekazywany, a kompilator nie może określić zamierzonego typu.
Aby uzyskać więcej informacji, zobacz Metody ogólne.
Wariancja parametrów typu
- CS1960: Nieprawidłowy modyfikator wariancji. Jako wariant można określić tylko parametry interfejsu i typu delegata.
- CS1961: Nieprawidłowa wariancja: parametr typu musi być kowariantnie prawidłowy dla "type". Parametr "type" jest kontrawariantny.
- CS8427: Wyliczenia, klasy i struktury nie mogą być deklarowane w interfejsie, który ma parametr typu "in" lub "out".
Modyfikatory wariancji (in dla kontrawariancji, out dla kowariancji) kontrolują sposób użycia parametrów typu w deklaracjach interfejsu i delegatów. Tylko interfejsy i delegaty obsługują wariancję. Kowariantny (out) parametr typu może pojawiać się tylko w pozycjach wyjściowych (zwracanych typach), podczas gdy kontrawariant (in) parametr typu może występować tylko w pozycjach wejściowych (typach parametrów).
- Używaj modyfikatorów wariancji tylko w parametrach interfejsu i typu delegata (CS1960). Klasy, struktury i inne deklaracje typów nie obsługują modyfikatorów wariancji. Tylko deklaracje
interfaceidelegatemogą używaćinluboutprzy swoich parametrach typu. - Użyj
out(kowariantnego) dla parametrów typu, które występują tylko w typach zwracanych, orazin(kontrawariantnego) dla parametrów typu, które występują tylko w typach parametrów (CS1961). Jeśli parametr typu musi być wyświetlany zarówno w pozycjach wejściowych, jak i wyjściowych, usuń modyfikator wariancji. - Nie deklaruj typów wyliczeniowych, klas ani struktur wewnątrz interfejsu wariantowego (CS8427). Zagnieżdżone deklaracje typów wewnątrz interfejsu mającego parametry typu
inluboutnie są dozwolone, ponieważ mogą naruszać zasady bezpiecznej wariancji. Przenieś typ zagnieżdżony poza deklaracją interfejsu.
Aby uzyskać więcej informacji, zobacz Covariance and Contravariance in Generics (Wariancja i Kontrawariancja w typach ogólnych).
Ograniczenia użycia typu ogólnego
-
CS0403: Nie można przekonwertować wartości null na argument typu, ponieważ może to być typ wartości nieprzyjmujący wartości null. Rozważ użycie
default(T)zamiast tego. -
CS0413: Nie można użyć parametru typu z operatorem
as, ponieważ nie ma ograniczenia typu klasy aniclassograniczenia. - CS0695: "type" nie może zaimplementować zarówno "interface1" jak i "interface2", ponieważ mogą się ujednolicić w przypadku niektórych zastąpień parametrów typu.
- CS0698: Typ ogólny nie może pochodzić z typu, ponieważ jest to klasa atrybutów.
- CS0704: Nie można wykonać wyszukiwania niewirtualnego elementu członkowskiego w typie, ponieważ jest to parametr typu.
- CS0718: "type": typy statyczne nie mogą być używane jako argumenty typu.
- CS1720: Wyrażenie zawsze spowoduje wyjątek System.NullReferenceException, ponieważ domyślna wartość typu ogólnego ma wartość null.
- CS1763: "parametr" jest typu "type". Domyślna wartość parametru typu odwołania innego niż ciąg może być inicjowana tylko z wartością null.
- CS8322: Nie można przekazać argumentu typu dynamicznego do ogólnej funkcji lokalnej z wywnioskowanym argumentami typu.
- CS9338: Niespójne ułatwienia dostępu: typ jest mniej dostępny niż klasa.
Te błędy odnoszą się do ograniczeń dotyczących sposobu użycia typów ogólnych i parametrów typu w wyrażeniach, dziedziczeniu i dostępie do składowych.
- Zastąp przypisania
nullnadefault(T)lub dodaj ograniczenieclass(CS0403). Podczas przypisywanianulldo niekonsekundowanego parametru typu kompilator nie może zagwarantować, że argument typu jest typem referencyjnym. Użyjdefault(T), które zapewnia odpowiednią wartość domyślną dla dowolnego typu, lub dodaj ograniczenieclass, jeśli potrzebujesz semantyki typu referencyjnego. - Dodaj
classlub ograniczenie określonego typu podczas korzystania z operatoraas(CS0413). Operatoraszwraca wartośćnull, jeśli konwersja się nie powiedzie, ale typy wartości nie mogą przyjmować wartościnull. Dodaj ograniczenieclass, aby zapewnić, że parametr typu jest zawsze typem referencyjnym. - Unikaj wielokrotnego implementowania tego samego interfejsu ogólnego z parametrami typu, które mogą zostać ujednolicone (CS0695). Gdy klasa implementuje interfejs ogólny wiele razy z różnymi parametrami typu (takimi jak
class G<T1, T2> : I<T1>, I<T2>), utworzenie wystąpienia z tym samym typem dla obu parametrów spowoduje konflikt. Zaimplementuj interfejs tylko raz lub zmień strukturę, aby zapobiec zjednoczeniu. - Usuń ogólne parametry typu z klas atrybutów (CS0698). Ten błąd nie jest już generowany w bieżących wersjach języka C#, ponieważ atrybuty ogólne są teraz obsługiwane.
- Użyj konkretnego typu ograniczenia zamiast parametru typu dla dostępu zagnieżdżonego elementu członkowskiego (CS0704). Nie można uzyskać dostępu do typów zagnieżdżonych ani składowych niewirtualnych za pomocą parametru typu. Zamiast
T.InnerType, użyj bezpośrednio znanego typu ograniczenia, takiego jakBaseClass.InnerType. - Nie używaj typów statycznych jako argumentów typu (CS0718). Nie można tworzyć instancji typów statycznych ani używać ich jako argumentów typów generycznych. Usuń typ statyczny z argumentu ogólnego.
- Unikaj wywoływania składowych instancji na
default(T), gdyTma ograniczenie do typu referencyjnego (CS1720). JeśliTma ograniczenieclass, todefault(T)ma wartośćnull, więc wywołanie składowych instancji dladefault(T)zawsze zgłasza wyjątek NullReferenceException. Dodaj sprawdzenie wartości null przed odwołaniem się do składowych lub zmień strukturę kodu, aby uniknąć bezpośredniego użyciadefault(T). - Użyj
nulljako wartości parametru domyślnego dla parametrów opcjonalnych, których typ jest typem odwołania (CS1763). Jeśli metoda ogólna ma parametr typuTiTjest typem referencyjnym, zastąpdefault(U)nanull, ponieważ wartości domyślne parametrów opcjonalnych muszą być stałymi czasu kompilacji, adefault(T)nie eliminuje tego wymagania. - Jawnie określ argumenty typu podczas przekazywania wartości dynamicznych do ogólnych funkcji lokalnych (CS8322). Po przekazaniu argumentu
dynamicdo ogólnej funkcji lokalnej kompilator nie może wywnioskować argumentów typu. Jawnie określ argument typu lub rzutuj wartość dynamiczną. - Upewnij się, że argumenty typu używane w sygnaturach publicznych lub chronionych są co najmniej tak dostępne jak składnik (CS9338). Publiczny generyczny człon składowy musi używać argumentów typów, które są publicznie dostępne. Ustaw argument typu jako publiczny lub zmniejsz dostępność elementu członkowskiego.
Aby uzyskać więcej informacji, zobacz Ograniczenia dotyczące parametrów typu i wyrażeń wartości domyślnych.
UnmanagedCallersOnly Ograniczenia
- CS8893: 'type' nie jest prawidłowym typem konwencji wywołania dla 'UnmanagedCallersOnly'.
- CS8894: Nie można użyć elementu „type” jako parametru ani typu zwracanego w metodzie oznaczonej atrybutem „UnmanagedCallersOnly”.
- CS8895: Metody przypisane "UnmanagedCallersOnly" nie mogą mieć ogólnych parametrów typu i nie mogą być deklarowane w typie ogólnym.
- CS8896: "UnmanagedCallersOnly" można stosować tylko do zwykłych statycznych nie abstrakcyjnych, niewirtuaicznych metod lub statycznych funkcji lokalnych.
Atrybut UnmanagedCallersOnlyAttribute oznacza metody, które mogą być wywoływane przez kod niezarządzany. Te metody mają ścisłe wymagania, ponieważ środowisko uruchomieniowe musi obsługiwać przejście między konwencjami wywoływania zarządzanych i niezarządzanych.
- Użyj tylko prawidłowych typów konwencji wywoływania w atrybucie
UnmanagedCallersOnly(CS8893). WłaściwośćCallConvsatrybutu akceptuje tylko rozpoznawane typy konwencji wywoływania zSystem.Runtime.CompilerServicesprzestrzeni nazw. - Użyj tylko typów blittable jako typów parametrów i typów zwracanych (CS8894). Metody oznaczone elementem
UnmanagedCallersOnlynie mogą używać typów zarządzanych (takich jakstringlubobject) jako typów parametrów lub typów zwracanych, ponieważ niezarządzany kod wywołujący nie może obsługiwać odwołań podlegających odśmiecaniu. - Usuń parametry typu ogólnego z
UnmanagedCallersOnlymetod i nie deklaruj ich w typach ogólnych (CS8895). Niezarządzane konwencje wywoływania nie obsługują typów ogólnych, ponieważ środowisko uruchomieniowe nie może określić prawidłowej konwencji wywoływania podstawiania typów ogólnych. - Zastosuj
UnmanagedCallersOnlytylko do zwykłych statycznych, nie abstrakcyjnych, niewirtuacyjnych metod lub statycznych funkcji lokalnych (CS8896). Metod instancji, metod abstrakcyjnych i metod wirtualnych nie można oznaczyć za pomocąUnmanagedCallersOnly, ponieważ niezarządzani wywołujący nie mogą wykonywać mechanizmów wywoływania wymaganych przez te metody.
Aby uzyskać więcej informacji, zobacz UnmanagedCallersOnlyAttribute.