Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek se zabývá následujícími chybami kompilátoru:
- CS0080: Omezení nejsou povolena u ne generických deklarací.
- CS0081: Deklarace parametru typu musí být identifikátor, nikoli typ.
- CS0224: Metoda s vararg nemůže být obecná, být v obecném typu nebo mít parametr params.
-
CS0304: Nelze vytvořit instanci typu proměnné, protože nemá
new()omezení. - CS0305: Použití obecného typu vyžaduje argumenty typu N.
- CS0306: Typ nelze použít jako argument typu.
- CS0307: Identifikátor nelze použít s argumenty typu.
- CS0308: Ne generický typ nebo metoda nelze použít s argumenty typu.
- CS0310: Typ musí být ne abstraktní typ s veřejným konstruktorem bez parametrů, aby ho mohl použít jako parametr v obecném typu nebo metodě.
-
CS0311: Typ nelze použít jako parametr
Ttypu v obecném typu nebo metodě. Neexistuje žádný implicitní převod odkazu z 'type1' na 'type2'. - CS0312: Typ type1 nelze použít jako parametr typu v obecném typu nebo metodě. Typ type1 s možnou hodnotou null nevyhovuje omezení "constraint".
- CS0313: Typ type1 nelze použít jako parametr typu v obecném typu nebo metodě. Typ type1 s možnou hodnotou null nevyhovuje omezení "constraint". Typy s možnou hodnotou null nemohou splňovat žádná omezení rozhraní.
- CS0314: Typ nelze použít jako parametr typu v generickém typu nebo metodě. Neexistuje žádná boxingová konverze ani konverze parametru typu z 'type' na 'constraint'.
-
CS0315: Typ nelze použít jako parametr typu
Tv generickém typu nebo metodě. Neexistuje žádná konverze boxing z typu 'type' na omezení 'constraint'. -
CS0401: Omezení
new()musí být poslední omezující omezení zadané. -
CS0403: Nelze převést hodnotu null na parametr typu, protože může být nenulový typ hodnoty. Místo toho zvažte použití
default(T). - CS0405: Duplicitní omezení pro parametr typu.
- CS0406: Omezení typu třídy "constraint" musí předcházet jiným omezením.
- CS0409: Klauzule constraint již byla zadána pro parametr type 'type parameter'. Všechna omezení parametru typu musí být zadána v jediné klauzuli where.
- CS0411: Argumenty typu metody "method" nelze odvodit z použití. Zkuste explicitně zadat argumenty typu.
- CS0412: Parametr: parametr, místní proměnná nebo místní funkce nesmí mít stejný název jako parametr typu metody.
-
CS0413: Parametr typu nelze použít s operátorem
as, protože nemá omezení typu třídy aniclassomezení. - CS0417: Identifikátor: Nelze zadat argumenty při vytváření instance typu proměnné.
-
CS0449: Omezení
class,struct,unmanaged,notnulladefaultnelze zkombinovat ani duplikovat a musí být uvedena jako první v seznamu omezení. -
CS0450: Parametr typu: Nelze zadat obojí, třídu omezení a zároveň omezení
classnebostruct. -
CS0451: Omezení
new()nelze použít sstructomezením. - CS0452: Typ "název typu" musí být referenčním typem, aby ho bylo možné použít jako parametr "název parametru" v obecném typu nebo metodě "generic".
- CS0453: Typ "název typu" musí být nenulový typ hodnoty, aby ho bylo možné použít jako parametr "název parametru" v obecném typu nebo metodě "generic".
- CS0454: Cyklická závislost omezení zahrnující parametr typu 1 a parametr typu 2.
- CS0455: Parametr typu dědí konfliktní omezení constraint1 a constraint2.
- CS0456: Parametr typu type parametr 1 má omezení "struktura", takže parametr typu 1 nelze použít jako omezení pro parametr type 2.
- CS0693: Parametr type 'type parameter' má stejný název jako parametr typu z vnějšího typu 'type'.
- CS0694: Parametr type má stejný název jako typ nebo metoda.
- CS0695: "type" nemůže implementovat "interface1" a "interface2", protože by se mohly sjednotit u některých substitucí parametrů typu.
- CS0698: Obecný typ nelze odvodit z typu, protože se jedná o třídu atributu.
- CS0699: 'generic' nedefinuje parametr typu 'identifier'.
- CS0701: Identifikátor není platné omezení. Typ použitý jako omezení musí být rozhraní, nezapečetěná třída nebo parametr typu.
- CS0702: Omezení nemůže být speciální třídou.
- CS0703: Nekonzistentní přístupnost: Typ omezení je méně přístupný než deklarace.
- CS0704: Nelze provést nevirtuální vyhledání členu v typu 'type', protože je parametrem typu.
- CS0706: Neplatný typ omezení. Typ použitý jako omezení musí být rozhraní, nezapečetěná třída nebo parametr typu.
- CS0717: Statická třída: Statické třídy nelze použít jako omezení.
- CS0718: Typ: Statické typy nelze použít jako argumenty typu.
- CS1720: Výraz vždy způsobí System.NullReferenceException, protože výchozí hodnota "obecný typ" je null.
- CS1763: Parametr je typu Type. Výchozí hodnota parametru jiného typu odkazu než řetězec lze inicializovat pouze s hodnotou null.
- CS1948: Proměnná rozsahu name nemůže mít stejný název jako parametr typu metody.
- CS1960: Neplatný modifikátor rozptylu Jako variantu lze zadat pouze parametry typu rozhraní a delegáta.
- CS1961: Neplatný rozptyl: Parametr typu musí být kovariantně platný pro typ. Parametr type je kontravariantní.
- CS3024: Typ omezení 'type' není kompatibilní se specifikací CLS.
- CS7002: Neočekávané použití obecného názvu
- CS8322: Argument s dynamickým typem nelze předat obecné místní funkci s odvozenými argumenty typu.
- CS8375: Omezení new() nelze použít s omezením "nespravovaný".
- CS8377: Typ 'type' musí být typ hodnoty, který nepřipouští hodnotu null, stejně jako všechna pole na libovolné úrovni vnoření, aby jej bylo možné použít jako parametr 'parameter' v obecném typu nebo metodě 'generic'.
- CS8379: Parametr typu type parametr 1 má omezení "nespravovaný", takže parametr typu 1 nelze použít jako omezení pro parametr typu 2.
- CS8380: "type": nemůže zadat jak třídu omezení, tak i omezení "nespravované".
- CS8387: Parametr type má stejný název jako parametr typu z vnější metody method.
- CS8389: Vynechání argumentu typu není v aktuálním kontextu povoleno.
- CS8427: Výčty, třídy a struktury nelze deklarovat v rozhraní, které má parametr typu in nebo out.
- CS8665: Metoda 'method' určuje omezení 'class' pro parametr typu 'type parameter', ale odpovídající parametr typu 'type parameter' přepisované nebo explicitně implementované metody 'method' není referenčním typem.
- CS8666: Metoda 'method' určuje omezení 'struct' pro parametr typu 'type parameter', ale odpovídající parametr typu 'type parameter' přepsané nebo explicitně implementované metody 'method' není nenulovatelný typ hodnoty.
- CS8822: Metoda methody method zadává omezení default pro parametr typu type parameter, ale odpovídající parametr typu type parameter přepsané nebo explicitně implementované metody method je omezen na referenční typ nebo typ hodnoty.
- CS8823: Omezení ‚default‘ je platné pouze pro metody přepsání a metody explicitní implementace rozhraní.
- CS8893: Type není platný typ konvence volání pro UnmanagedCallersOnly.
- CS8894: Nelze použít 'type' jako parametr nebo návratový typ metody atributu 'UnmanagedCallersOnly'.
- CS8895: Metody atributu UnmanagedCallersOnly nemohou mít parametry obecného typu a nelze je deklarovat v obecném typu.
- CS8896: UnmanagedCallersOnly lze použít pouze na běžné statické ne abstraktní, ne-virtuální metody nebo statické místní funkce.
-
CS9011: Klíčové slovo
delegatenelze použít jako omezení. Myslel jsiSystem.Delegateto? -
CS9012: Neočekávané klíčové slovo
record. Myslel jsirecord struct, neborecord class? - CS9338: Nekonzistentní přístupnost: typ je méně přístupný než třída.
Deklarace a pojmenování parametru typu
- CS0080: Omezení nejsou povolena u ne generických deklarací.
- CS0081: Deklarace parametru typu musí být identifikátor, nikoli typ.
- CS0412: Parametr: parametr, místní proměnná nebo místní funkce nesmí mít stejný název jako parametr typu metody.
- CS0693: Parametr type 'type parameter' má stejný název jako parametr typu z vnějšího typu 'type'.
- CS0694: Parametr type má stejný název jako typ nebo metoda.
- CS0699: 'generic' nedefinuje parametr typu 'identifier'.
- CS1948: Proměnná rozsahu name nemůže mít stejný název jako parametr typu metody.
- CS8387: Parametr type má stejný název jako parametr typu z vnější metody method.
-
CS9012: Neočekávané klíčové slovo
record. Myslel jsirecord struct, neborecord class?
Tyto chyby se týkají způsobu deklarace a parametrů typu názvu v obecných typech a metodách. Názvy parametrů typu musí být platné identifikátory, nesmí být v konfliktu s jinými identifikátory v oboru a musí se objevit v seznamu parametrů typu deklarace.
- Odeberte klauzuli omezení z negenerických deklarací (CS0080). Klauzuli
wherelze použít pouze u obecných typů a metod, které deklarují parametry typu. Pokud potřebujete použít omezení, nejprve přidejte parametry typu do deklarace typu nebo metody. - Nahraďte skutečné názvy typů identifikátory v deklarací parametru typu (CS0081). Parametry typu je nutné deklarovat pomocí identifikátorů (například
T,TKeyneboTValue) místo konkrétních typů (jakointnebostring). Účelem parametru typu je sloužit jako zástupný symbol, který kompilátor při použití obecného typu nebo metody nahradí skutečnými typy. - Přejmenujte parametry typu, místní proměnné, parametry nebo proměnné rozsahu, aby nedocházelo ke konfliktům názvů (CS0412, CS0694, CS1948). Názvy parametrů typu nemůžou stínovat identifikátory ve stejném oboru a nemůžou odpovídat názvu obsahujícího typu nebo metody. Proměnné rozsahu LINQ také nemůžou znovu použít název parametru typu metody. Takové konflikty vytvářejí nejednoznačnost, na který identifikátor se odkazuje.
- Pro parametry vnitřního typu, které stínují vnější parametry (CS0693, CS8387), použijte jiný název. Pokud je obecný člen (například metoda nebo vnořený typ) uvnitř obecné třídy nebo metody, není parametr vnitřního typu nutně stejný jako vnější. Když jim dejte stejný název, vznikne nejasnost o tom, na který parametr typu se odkazuje. Pro parametr vnitřního typu použijte jedinečný název.
- Ujistěte se, že jsou všechny parametry typu v klauzulích omezení deklarovány v seznamu parametrů typu (CS0699).
whereKlauzule může odkazovat pouze na parametry typu, které se zobrazují v obecné deklaraci. Pokud název v klauzuli neodpovídá žádnému deklarovanému parametruwheretypu, zkontrolujte překlepy nebo chybně napsané texty. - Použijte správnou syntaxi deklarace záznamu (CS9012). Při deklarování typu záznamu musíte použít buď
record classneborecord struct(nebo jenrecordpro odkazový typ). Samotnérecordklíčové slovo se nemůže objevit v pozicích, kde kompilátor očekává jinou syntaxi deklarace.
Další informace naleznete v tématu Obecné parametry typů a obecné typy.
Deklarace omezení a řazení
-
CS0401: Omezení
new()musí být poslední omezující omezení zadané. - CS0406: Omezení typu třídy "constraint" musí předcházet jiným omezením.
- CS0409: Klauzule constraint již byla zadána pro parametr type 'type parameter'. Všechna omezení parametru typu musí být zadána v jediné klauzuli where.
-
CS0449: Omezení
class,struct,unmanaged,notnulladefaultnelze kombinovat ani duplikovat a musí být uvedena jako první v seznamu omezení. -
CS0450: Parametr typu: Nelze zadat současně jak třídu omezení, tak i omezení
classnebostruct. -
CS0451: Omezení
new()nelze použít sstructomezením. - CS8375: Omezení new() nelze použít s omezením "nespravovaný".
- CS8380: "type": nemůže zadat jak třídu omezení, tak i omezení "nespravované".
-
CS9011: Klíčové slovo
delegatenelze použít jako omezení. Myslel jsiSystem.Delegateto?
Omezení parametrů typu musí následovat určité pořadí: primární omezení (class, struct, unmanaged, notnull nebo default) jsou na prvním místě, pak následuje omezení typu třídy, po něm omezení rozhraní a nakonec omezení konstruktoru new(). Některá omezení se vzájemně vylučují a nelze je kombinovat. Všechna omezení pro jeden parametr typu musí být uvedena v jediné where klauzuli.
-
new()Umístěte omezení na konec seznamu omezení (CS0401). Omezenínew()se musí zobrazit po všech ostatních omezeních. Například změňtewhere T : new(), IDisposablenawhere T : IDisposable, new(). - Před omezení rozhraní (CS0406) umístěte omezení typu třídy. Pokud omezíte parametr typu na konkrétní základní třídu spolu s rozhraními, musí se třída zobrazit jako první. Například změňte
where T : IDisposable, MyBaseClassnawhere T : MyBaseClass, IDisposable. - Zkombinujte všechna omezení parametru typu do jediné
whereklauzule (CS0409). Pro stejný parametr typu nemůžete použít vícewhereklauzulí. Sloučit je do jedné klauzule: změnitwhere T : I where T : new()nawhere T : I, new(). Vícewhereklauzulí je platné pouze v případech, kdy cílí na různé parametry typu. - Nejprve umístěte primární omezení a nekombinujte vzájemně se vylučujících omezení (CS0449). Můžete zadat nejvýše jednu z hodnot
class,struct,unmanaged,notnullnebodefault, a musí být uvedena jako první v seznamu omezení. Omezeníclassastructjsou navzájem vylučující, stejně jako omezeníclassaunmanaged. - Nekombinujte určité omezení třídy s
class,structnebounmanaged(CS0450, CS8380). Pokud je parametr typu omezen na konkrétní typ třídy, implicitně se jedná o odkazový typ, který je v rozporu s danýmstructtypem nebounmanagedomezením. Odeberte buď omezení třídy, nebo primární omezení. - Nekombinujte
new()sstructaniunmanaged(CS0451, CS8375). Všechny typy hodnot mají implicitně veřejný konstruktor bez parametrů, takženew()omezení je redundantní při kombinaci sstruct. Totéž platí prounmanaged, což znamenástruct.new()Odeberte omezení. - Nahraďte
delegatezaSystem.Delegatev omezených klauzulích (CS9011). Klíčovédelegateslovo se používá pro deklarování typů delegátů, nikoli jako omezení. Chcete-li omezit parametr typu na typy delegátů, použijteSystem.Delegatejako typ omezení.
Další informace naleznete v tématu Omezení parametrů typu.
Platné typy omezení
- CS0405: Duplicitní omezení pro parametr typu.
- CS0701: Identifikátor není platné omezení. Typ použitý jako omezení musí být rozhraní, nezapečetěná třída nebo parametr typu.
- CS0702: Omezení nemůže být speciální třídou.
- CS0703: Nekonzistentní přístupnost: Typ omezení je méně přístupný než deklarace.
- CS0706: Neplatný typ omezení. Typ použitý jako omezení musí být rozhraní, nezapečetěná třída nebo parametr typu.
- CS0717: Statická třída: Statické třídy nelze použít jako omezení.
- CS3024: Typ omezení 'type' není kompatibilní se specifikací CLS.
Omezení musí být rozhraní, nezapečetěná třída nebo parametr typu. Některé typy jsou neplatné jako omezení z důvodu jejich zvláštního významu v systému typů .NET nebo proto, že je nelze zdědit.
- Odeberte duplicitní omezení (CS0405). Každé omezení se může zobrazit pouze jednou v klauzuli constraint. Pokud máte
where T : I, I, odstraňte duplikát. - Jako omezení používejte pouze nezapečetěné typy (CS0701). Zapečetěné třídy, struktury a výčty nelze zdědit, takže neslouží k žádnému účelu jako omezení. Použijte rozhraní, které implementují požadované typy, nebo použijte nezapečetěnou základní třídu.
- Nepoužívejte speciální třídy jako omezení (CS0702). Typy Object, Array a ValueType nelze použít jako omezení. Každý typ již je odvozen od
Object, takže omezení na něj neposkytuje žádnou hodnotu.ArrayaValueTypejsou abstraktní základní typy, které nelze přímo zdědit. Pokud potřebujete chování podobné poli, použijteIList<T>neboIEnumerable<T>místo toho. - Ujistěte se, že jsou typy omezení alespoň tak přístupné jako obecný typ (CS0703). Veřejný obecný typ nemůže mít omezení pomocí interních typů, protože externí kód by nemohl poskytovat platné argumenty typu. Buď nastavíte typ omezení jako veřejný, nebo zmenšete přístupnost obecného typu.
- Jako omezení používejte pouze rozhraní, nezapečetěné třídy nebo parametry typu (CS0706). Jako omezení nelze použít pole, zapečetěné třídy, struktury, výčty nebo jiné neplatné typy. Zvažte použití rozhraní, které implementují požadované typy.
- Nepoužívejte statické třídy jako omezení (CS0717). Statické třídy nelze rozšířit, protože obsahují pouze statické členy. Žádný typ nemůže dědit ze statické třídy, takže ji nelze použít jako omezení.
- Pro omezení typu (CS3024) použijte typ kompatibilní se specifikací CLS. Když je sestavení označeno
[assembly: CLSCompliant(true)], použití typu, který není kompatibilní se specifikací CLS jako omezení obecného typu, může znemožnit kód napsaný v některých jazycích využívat vaši obecnou třídu.
Další informace naleznete v tématu Omezení parametrů typu.
Uspokojení omezení a konverze
-
CS0311: Typ nelze použít jako parametr
Ttypu v obecném typu nebo metodě. Neexistuje žádný implicitní převod odkazu z 'type1' na 'type2'. - CS0312: Typ nelze použít jako parametr typu v obecném typu nebo metodě. Typ s možnou hodnotou null nevyhovuje omezení "constraint".
- CS0313: Typ nelze použít jako parametr typu v obecném typu nebo metodě. Typ s možnou hodnotou null nevyhovuje omezení "constraint". Typy s možnou hodnotou null nemohou splňovat žádná omezení rozhraní.
- CS0314: Typ nelze použít jako parametr typu v generickém typu nebo metodě. Neexistuje žádný převod na zabalený typ ani konverze parametru typu z typu 'type' na typ 'constraint'.
-
CS0315: Typ nelze použít jako parametr type
Tv generickém typu nebo metodě. Neexistuje žádná konverze boxingem z typu 'type' na 'constraint'. - CS0452: Typ "název typu" musí být referenčním typem, aby ho bylo možné použít jako parametr "název parametru" v obecném typu nebo metodě "generic".
- CS0453: Typ "název typu" musí být nenulový typ hodnoty, aby ho bylo možné použít jako parametr "název parametru" v obecném typu nebo metodě "generic".
- CS8377: Typ 'type' musí být nenulovatelný typ hodnoty a rovněž všechna jeho pole na všech úrovních vnoření, aby jej bylo možné použít jako parametr 'parameter' v obecném typu nebo metodě 'generic'.
K těmto chybám dochází v případě, že argument typu nevyhovuje omezením deklarovaným u parametru obecného typu. Argument typu musí mít správné převody, vztahy dědičnosti a strukturální vlastnosti, aby odpovídaly všem omezením.
- Změňte argument typu na argument typu, který má implicitní převod odkazu na typ omezení (CS0311). Pokud má parametr typu omezení, jako je
where T : BaseType, musí být jakýkoli argument typu konvertovat naBaseTypepomocí implicitního převodu reference nebo převodu identity. Implicitní číselné převody (například zshortdoint) nevyhovují omezením parametru obecného typu. - Použijte nenulové typy hodnot nebo změňte typ omezení (CS0312, CS0313). Typy hodnot s možnou hodnotou null (například
int?) se liší od jejich základních hodnotových typů a nesplňují stejná omezení. Typy hodnot s možnou hodnotou null nemohou splnit omezení rozhraní, protože samotný obalový typ nullable toto rozhraní neimplementuje. Jako argument typu použijte nenulovatelnou formu hodnotového typu. - Opakujte omezení parametru typu základní třídy v jakékoli deklaraci odvozené třídy (CS0314). Pokud odvozená obecná třída dědí z omezené základní obecné třídy, odvozená třída musí deklarovat stejná omezení odpovídajících parametrů typu.
- Ujistěte se, že argumenty typu vyhovují omezením typu odkazu nebo třídy (CS0315). Pokud je parametr typu omezen na třídní typ, nemůžete jako argument typu použít hodnotový typ (struct), protože neexistuje žádný převod na boxing, který by splňoval vztah omezení. Použijte odkazový typ, který dědí omezení nebo implementuje omezení.
- Pokud je zadáno omezení
class, použijte jako argument typu referenční typ (CS0452). Hodnotové typy, jako jsoustructneboint, nemohou splňovat omezeníclass. Změňte argument typu na typ odkazu nebo odeberteclassomezení, pokud obecný typ může pracovat s typy hodnot. - Pokud je zadané omezení (
struct), jako argument typu použijte typ hodnoty, který nemá hodnotu null. Odkazové typy, typy hodnot s možnou hodnotou null (int?) a jiné typy bez hodnot nemůžoustructsplňovat omezení. Použijte konkrétní typ hodnoty, který není nullable, napříkladint,doublenebo uživatelem definovanýstruct. - Použijte typ, jehož všechna pole jsou nespravovaných typů, pokud je zadáno omezení
unmanaged(CS8377). Omezeníunmanagedvyžaduje hodnotový typ, který nepřipouští hodnotu null a u něhož je každé pole na každé úrovni vnoření rovněž nespravovaného typu. Typy obsahující pole typu odkaz nebo parametry obecného typu, o kterých není známo, že nejsou nespravované, nevyhovují tomuto omezení.
Další informace naleznete v tématu Omezení parametrů typu.
Konflikty omezení a cyklické závislosti
- CS0454: Cyklická závislost omezení zahrnující parametr typu 1 a 2.
- CS0455: Parametr typu dědí konfliktní omezení constraint1 a constraint2.
- CS0456: Parametr typu type parametr 1 má omezení "struktura", takže parametr typu 1 nelze použít jako omezení pro parametr type 2.
- CS8379: Parametr typu type parametr 1 má omezení "nespravovaný", takže parametr typu 1 nelze použít jako omezení pro parametr typu 2.
Omezení nemohou vytvářet cyklické závislosti a parametry typu nemůžou dědit konfliktní omezení, která není možné současně splňovat. Omezení typu hodnoty (struct a unmanaged) jsou implicitně zapečetěná, takže je nelze použít jako omezení u jiných parametrů typu.
- Odeberte závislosti cyklických omezení (CS0454). Parametr typu nemůže přímo nebo nepřímo záviset na sobě prostřednictvím jeho omezení. Například
where T : U where U : Tvytvoří cyklickou závislost. Ukončete cyklus odebráním jednoho z omezení. - Odeberte konfliktní zděděná omezení (CS0455). Parametr typu nelze omezit na více nesouvisejících tříd, protože jazyk C# nepodporuje dědičnost více tříd. Podobně ho nelze omezit jak na
struct, tak na typ třídy. Změna struktury hierarchie typů nebo odebrání některého z konfliktních omezení - Nepoužívejte parametr typu omezený pomocí
structnebounmanagedjako omezení pro jiný parametr typu (CS0456, CS8379). Omezení typu hodnoty jsou implicitně zapečetěná, takže z nich nemůže být odvozen žádný jiný typ. Chcete-li tuto chybu vyřešit, umístěte typ hodnoty nebo nespravované omezení přímo na druhý parametr typu namísto jeho nepřímého omezení prostřednictvím prvního parametru typu.
Další informace naleznete v tématu Omezení parametrů typu.
Pravidla pro přepsání a omezení implementace
- CS8665: Metoda 'method' určuje omezení 'class' pro parametr typu 'type parameter', ale odpovídající parametr typu 'type parameter' přepisované nebo explicitně implementované metody 'method' není referenčním typem.
- CS8666: Metoda 'method' určuje omezení 'struct' pro parametr typu 'type parameter', ale odpovídající parametr typu 'type parameter' přepisované nebo explicitně implementované metody 'method' není typ hodnoty nepřipouštějící hodnotu null.
- CS8822: Metoda 'method' určuje omezení 'default' pro parametr typu 'type parameter', ale odpovídající parametr typu 'type parameter' přepisované nebo explicitně implementované metody 'method' je omezen na referenční typ nebo hodnotový typ.
- CS8823: Omezení „default“ je platné pouze u metod přepsání a explicitní implementace rozhraní.
Pokud přepíšete virtuální metodu nebo explicitně implementujete metodu rozhraní, musí být omezení parametrů typu přepsání metody kompatibilní s omezeními základní metody. Omezení default je speciální modifikátor používaný pouze v případech přepsání a explicitní implementace rozhraní k označení toho, že parametr typu nemá ani omezení class, ani struct.
- Ujistěte se, že omezení přepisující metody odpovídají omezením základní metody (CS8665, CS8666). Přepsání nemůže přidat omezení
class, pokud odpovídající parametr typu základní metody není omezen na referenční typ. Podobně nemůže přidatstructomezení, pokud parametr typu základní metody není omezen na typ hodnoty. Přepsání musí být kompatibilní se základní deklarací. -
defaultOmezení použijte pouze v případech, kdy je parametr typu základní metody unconstrained (CS8822). Omezenídefaultoznačuje, že parametr typu nemá žádnéclassomezení nebostructomezení.defaultnelze použít, pokud odpovídající parametr typu u přepisované metody již má omezeníclassnebostruct. -
defaultOmezení použijte pouze u přepisujících metod nebo metod explicitní implementace rozhraní (CS8823). Omezenídefaultnení platné pro deklarace běžných metod. Existuje konkrétně proto, aby odstranil nejednoznačnost při přepisování metody, u níž základní verze měla typový parametr bez omezení, a je potřeba uvést, že přepsaná verze jej také ponechává bez omezení.
Další informace naleznete v tématu Omezení parametrů typu a default omezení.
Omezení konstruktoru
-
CS0304: Nelze vytvořit instanci typu proměnné, protože nemá
new()omezení. - CS0310: Typ musí být ne abstraktní typ s veřejným konstruktorem bez parametrů, aby ho mohl použít jako parametr v obecném typu nebo metodě.
- CS0417: Identifikátor: Nelze zadat argumenty při vytváření instance typu proměnné.
Tyto chyby se vztahují k new() omezení a vytvoření instance parametrů typu pomocí operátoru new .
- Přidejte omezení
new()k parametrům typu, které potřebujete vytvořit (CS0304). Při použitínew T()uvnitř obecného typu nebo metody musí kompilátor zaručit, že jakýkoli argument typu má konstruktor bez parametrů. Totonew()omezení poskytuje tuto záruku. - Ujistěte se, že argumenty typu mají veřejné konstruktory bez parametrů (CS0310). Pokud má
new()parametr typu omezení, musí být jakýkoli konkrétní typ použitý jako argument typu ne abstraktní a musí poskytovat veřejný konstruktor bez parametrů. Typy s pouze privátními, chráněnými nebo parametrizovanými konstruktory nemohou splňovatnew()omezení. - Při vytváření instancí parametrů typu (CS0417) odeberte argumenty konstruktoru. Omezení
new()zaručuje pouze konstruktor bez parametrů. Argumenty nelze předat prvkunew T(arguments). Pokud potřebujete vytvářet instance s konkrétními argumenty, zvažte použití továrního vzoru nebo omezení na rozhraní, které definuje způsob vytváření objektů.
Další informace naleznete v tématu Omezení parametrů typu a new() omezení.
Počet argumentů typu a jejich použití
- CS0224: Metoda s vararg nemůže být obecná, být v obecném typu nebo mít parametr params.
- CS0305: Použití obecného typu vyžaduje argumenty typu N.
- CS0306: Typ nelze použít jako argument typu.
- CS0307: Identifikátor nelze použít s argumenty typu.
- CS0308: Ne generický typ nebo metoda nelze použít s argumenty typu.
- CS7002: Neočekávané použití obecného názvu
- CS8389: Vynechání argumentu typu není v aktuálním kontextu povoleno.
Tyto chyby souvisejí s poskytnutím správného počtu a typu argumentů obecným typům a metodám.
- Odeberte parametry obecného typu nebo obsahující deklarace obecného typu z metod, které používají
__arglist(CS0224). Klíčové__arglistslovo není kompatibilní s obecnými typy, protože mechanismy modulu runtime pro zpracování seznamů argumentů proměnných jsou v konfliktu s nahrazením typu vyžadovaným pro parametry obecného typu. - Zadejte přesný počet argumentů typu zadaných v obecné deklaraci (CS0305). Každý parametr obecného typu v definici musí mít odpovídající argument typu při vytvoření instance obecného typu.
- Jako argumenty typu používejte pouze platné typy (CS0306). Typy ukazatelů (například
int*nebochar*) nelze použít jako argumenty typu, protože generické typy vyžadují spravované typy, které může modul pro uvolňování paměti sledovat. - Odeberte syntaxi argumentu typu z ne generických konstruktorů (CS0307, CS0308). Argumenty typu uzavřené v hranatých závorkách lze použít pouze pro obecné typy a metody, které deklarují parametry typu. Ujistěte se, že jste importovali obor názvů, který obsahuje obecnou verzi typu.
- Odeberte parametry typu z deklarací, které nepodporují obecné typy (CS7002). Některé konstrukce, jako jsou výčty, nemohou být obecné. Pokud potřebujete obecný kontejner pro výčtové hodnoty, zvažte místo toho použití obecné třídy nebo struktury.
- Zadejte explicitně všechny argumenty požadovaného typu (CS8389). V některých kontextech, jako je použití operátoru
typeofnebo vytváření delegátů, musíte zadat všechny argumenty typu a nemůžete je vynechat. Použijte napříkladtypeof(List<int>)místo pokusu o vynechání argumentu typu.
Další informace naleznete v tématu Obecné parametry typů a obecné typy.
Odvozování typu argumentu
- CS0411: Argumenty typu metody "method" nelze odvodit z použití. Zkuste explicitně zadat argumenty typu.
K této chybě dochází při volání obecné metody bez explicitního zadání argumentů typu a kompilátor nemůže odvodit, které argumenty typu máte v úmyslu. Kompilátor odvodí argumenty typu z typů argumentů metody, které předáte v místě volání.
- Zadejte argumenty typu explicitně v hranatých závorkách (CS0411). Pokud kompilátor nedokáže určit argumenty typu z argumentů metody, zadejte je přímo. Například změňte
G()naG<int>(). K této chybě obvykle dochází v případě, že obecná metoda nemá žádné parametry, ze kterých se má typ odvodit, nebo kdyžnullje předaný argument a kompilátor nemůže určit zamýšlený typ.
Další informace naleznete v tématu Obecné metody.
Variance parametru typu
- CS1960: Neplatný modifikátor rozptylu Jako variantu lze zadat pouze parametry typu rozhraní a delegáta.
- CS1961: Neplatný rozptyl: Parametr typu musí být kovariantně platný pro typ. Parametr type je kontravariantní.
- CS8427: Výčty, třídy a struktury nelze deklarovat v rozhraní, které má parametr typu in nebo out.
Modifikátory variance (in pro kontravarianci, out pro kovarianci) určují, jak lze používat parametry typu v deklaracích rozhraní a delegátů. Rozptyl podporují pouze rozhraní a delegáti. Parametr kovariantního typu (out) se může objevit pouze ve výstupních pozicích (návratových typech), zatímco parametr typu kontravariant (in) se může objevit pouze ve vstupních pozicích (typy parametrů).
- Modifikátory odchylek používejte pouze u parametrů rozhraní a typu delegáta (CS1960). Třídy, struktury a další deklarace typů nepodporují modifikátory rozptylu. Pouze deklarace
interfaceadelegatemohou u svých parametrů typu použítinneboout. - Použijte
out(kovariantní) pro parametry typu, které se zobrazují pouze ve návratových typech, ain(kontravariantní) pro parametry typu, které se zobrazují pouze v typech parametrů (CS1961). Pokud se parametr typu musí objevit na vstupních i výstupních pozicích, odeberte modifikátor rozptylu. - Neeklarujte výčty, třídy nebo struktury uvnitř variantového rozhraní (CS8427). Vnořené deklarace typu uvnitř rozhraní, které má
inparametry typu,outnejsou povoleny, protože by mohly porušit bezpečnostní pravidla odchylky. Přesuňte vnořený typ mimo deklaraci rozhraní.
Další informace naleznete v tématu Kovariance a Kontravariance v obecných formátech.
Omezení použití obecného typu
-
CS0403: Nelze převést hodnotu null na parametr typu, protože může být nenulový typ hodnoty. Místo toho zvažte použití
default(T). -
CS0413: Parametr typu nelze použít s operátorem
as, protože nemá omezení typu třídy aniclassomezení. - CS0695: "type" nemůže implementovat "interface1" i "interface2", protože se mohou sjednotit u některých nahrazení parametrů typu.
- CS0698: Obecný typ nelze odvodit z typu, protože se jedná o třídu atributu.
- CS0704: Nelze provést nevirtuální vyhledávání členu v typu ‚type‘, protože jde o parametr typu.
- CS0718: Typ: Statické typy nelze použít jako argumenty typu.
- CS1720: Výraz vždy způsobí System.NullReferenceException, protože výchozí hodnota "obecný typ" je null.
- CS1763: Parametr je typu Type. Výchozí hodnota parametru jiného typu odkazu než řetězec lze inicializovat pouze s hodnotou null.
- CS8322: Argument s dynamickým typem nelze předat obecné místní funkci s odvozenými argumenty typu.
- CS9338: Nekonzistentní přístupnost: typ je méně přístupný než třída.
Tyto chyby souvisejí s omezeními, jak se dají obecné typy a parametry typů používat ve výrazech, dědičnosti a přístupu členů.
- Nahraďte
nullpřiřazenídefault(T)nebo přidejte omezeníclass(CS0403). Při přiřazovánínullk nekontrénovanému parametru typu nemůže kompilátor zaručit, že argument typu je referenčním typem. Použijtedefault(T), který poskytuje odpovídající výchozí hodnotu pro libovolný typ, nebo přidejteclassomezení, pokud konkrétně potřebujete sémantiku typu odkazu. - Přidejte omezení určitého typu
classpři použitíasoperátoru (CS0413). Operátorasvrátínull, pokud převod selže, ale typy hodnot nemohou býtnull.classPřidejte omezení, abyste zajistili, že parametr typu je vždy referenčním typem. - Vyhněte se vícenásobné implementaci stejného obecného rozhraní s parametry typu, které by mohly sjednotit (CS0695). Když třída implementuje obecné rozhraní vícekrát s různými parametry typu (například
class G<T1, T2> : I<T1>, I<T2>), vytvoření instance se stejným typem pro oba parametry by vytvořil konflikt. Implementujte rozhraní pouze jednou nebo ho restrukturalizujte tak, aby se zabránilo sloučení. - Odeberte parametry obecného typu z tříd atributů (CS0698). Tato chyba se už nevygeneruje v aktuálních verzích jazyka C#, protože se teď podporují obecné atributy.
- Místo parametru typu použijte konkrétní typ omezení pro přístup vnořeného člena (CS0704). Prostřednictvím parametru typu nemáte přístup k vnořeným typům nebo ne virtuálním členům.
T.InnerTypeMísto toho použijte známý typ omezení přímo, napříkladBaseClass.InnerType. - Nepoužívejte statické typy jako argumenty typu (CS0718). Statické typy nelze instanciovat a nelze je použít jako argumenty generických typů. Odeberte statický typ z obecného argumentu.
- Vyhněte se volání členů instance na
default(T), pokud jeTomezen na referenční typ (CS1720). Pokud máTomezeníclass, jedefault(T)null, takže volání členů instance u něj vždy vyvolá NullReferenceException. Před voláním členů přidejte kontrolu null nebo restrukturalizujete kód, abyste se vyhnuli přímému použitídefault(T). - Slouží
nulljako výchozí hodnota parametru pro volitelné parametry, jejichž typ je referenčním typem (CS1763). Pokud má obecná metoda parametr typuTaTje referenčním typem, nahraďtedefault(U)jinull, protože volitelné výchozí hodnoty parametrů musí být konstanty kompilace adefault(T)tento požadavek nevyřeší. - Explicitně zadejte argumenty typu při předávání dynamických hodnot obecným místním funkcím (CS8322). Když předáte
dynamicargument obecné místní funkci, kompilátor nemůže odvodit argumenty typu. Explicitně zadejte argument typu nebo přetypujte dynamickou hodnotu. - Ujistěte se, že argumenty typu použité ve veřejných nebo chráněných podpisech jsou alespoň tak přístupné jako daný člen (CS9338). Veřejný obecný člen musí používat argumenty typu, které jsou veřejně přístupné. Buď zpřístupníte argument typu, nebo zmenšete přístupnost člena.
Další informace najdete v tématu Omezení parametrů typu a výchozích výrazů hodnot.
UnmanagedCallersOnly Omezení
- CS8893: 'type' není platný typ konvence volání pro 'UnmanagedCallersOnly'.
- CS8894: Nelze použít 'type' jako parametr nebo návratový typ metody atributu 'UnmanagedCallersOnly'.
- CS8895: Metody atributu UnmanagedCallersOnly nemohou mít parametry obecného typu a nelze je deklarovat v obecném typu.
- CS8896: UnmanagedCallersOnly lze použít pouze na běžné statické ne abstraktní, ne-virtuální metody nebo statické místní funkce.
Atribut UnmanagedCallersOnlyAttribute označuje metody, které nespravovaný kód může volat. Tyto metody mají přísné požadavky, protože modul runtime musí zpracovávat přechod mezi spravovanými a nespravovanými konvencemi volání.
- V atributu
UnmanagedCallersOnlypoužívejte pouze platné typy konvencí volání (CS8893). VlastnostCallConvsatributu přijímá pouze rozpoznané typy konvence volání zSystem.Runtime.CompilerServicesoboru názvů. - Jako parametr a návratové typy používejte pouze blittable typy (CS8894). Metody označené pomocí
UnmanagedCallersOnlynemůžou používat spravované typy (napříkladstringneboobject) jako typy parametrů nebo návratové typy, protože nespravovaný volající kód nedokáže spravovat odkazy uvolňované garbage collectorem. - Odeberte parametry typu z metod
UnmanagedCallersOnlya nedeklarujte je v generických typech (CS8895). Nespravované konvence volání nepodporují obecné typy, protože modul runtime nedokáže určit správnou konvenci volání pro nahrazení obecného typu. - Platí
UnmanagedCallersOnlypouze pro běžné statické, ne abstraktní, ne-virtuální metody nebo statické místní funkce (CS8896). Metody instance, abstraktní metody a virtuální metody nelze označitUnmanagedCallersOnly, protože nespravované volající nemůžou provádět mechanismy odesílání, které tyto metody vyžadují.
Další informace najdete na webu UnmanagedCallersOnlyAttribute.