Általános típusparaméterekkel és általános típusargumentumokkal kapcsolatos hibák és figyelmeztetések elhárítása

Ez a cikk a következő fordítóhibákat ismerteti:

  • CS0080: A nem általános deklarációkra vonatkozó korlátozások nem engedélyezettek.
  • CS0081: A típusparaméter-deklarációnak nem típusnak, hanem azonosítónak kell lennie.
  • CS0224: A vararg metódus nem lehet általános, nem lehet általános típus, vagy params paraméterrel rendelkezik.
  • CS0304: Nem hozható létre a változótípus egy példánya, mert nincs megkötése new() .
  • CS0305: Az általános típus használatához N típusú argumentumokra van szükség.
  • CS0306: A típus nem használható típusargumentumként.
  • CS0307: Az azonosító nem használható típusargumentumokkal.
  • CS0308: A nem általános típus- vagy metódus nem használható típusargumentumokkal.
  • CS0310: A típusnak nem absztrakt típusúnak kell lennie egy nyilvános paraméter nélküli konstruktorral ahhoz, hogy paraméterként használhassa az általános típusban vagy metódusban.
  • CS0311: A típus nem használható típusparaméterként T az általános típusban vagy metódusban. Az 1. típusról a "type2" típusra történő implicit referenciaátalakítás nem történik.
  • CS0312: A(z) 'type1' típus nem használható típusparaméterként a generikus típusban vagy metódusban. A(z) 'type1' nullable típus nem felel meg a(z) 'constraint' megszorításnak.
  • CS0313: A(z) 'type1' típus nem használható típusparaméterként a generikus típusban vagy metódusban. A(z) 'type1' null értékű típus nem felel meg a(z) 'constraint' megszorításának. A null értékű típusok nem felelhetnek meg interfészre vonatkozó megszorításoknak.
  • CS0314: A típus nem használható típusparaméterként a generikus típusban vagy metódusban. Nincs boxolási konverzió vagy típusparaméter-konverzió a(z) „type” típusról a(z) „constraint” megkötésre.
  • CS0315: A típus nem használható típusparaméterként T a generikus típusban vagy metódusban. Nincs becsomagolási átalakítás a(z) 'type' típusról a(z) 'constraint' típusra.
  • CS0401: A new() korlátozásnak az utolsó megadott korlátozó kényszernek kell lennie.
  • CS0403: A null érték nem konvertálható típusparamétersé, mert lehet, hogy nem null értékű. Fontolja meg a használatát default(T) .
  • CS0405: Ismétlődő kényszer a típusparaméterhez.
  • CS0406: Az 'constraint' osztálytípusra vonatkozó megszorításnak minden más megszorítást meg kell előznie.
  • CS0409: A "típusparaméter" típusparaméterhez már meg van adva egy kényszerzáradék. A típusparaméterre vonatkozó összes korlátozást egyetlen hol záradékban kell megadni.
  • CS0411: A metódus típusargumentumai nem vonhatók ki a használatból. Próbálja meg explicit módon megadni a típusargumentumokat.
  • CS0412: Paraméter: egy paraméter, helyi változó vagy helyi függvény nem rendelkezhet ugyanazzal a névvel, mint egy metódustípus-paraméter.
  • CS0413: A típusparaméter nem használható az as operátorral, mert nem rendelkezik osztálytípus-korlátozással vagy kényszerrel class .
  • CS0417: Azonosító: nem adható meg argumentum egy változótípusú példány létrehozásakor.
  • CS0449: A class, struct, unmanaged, notnullés default kényszerek nem kombinálhatók vagy duplikálhatók, és először meg kell adni a kényszerek listájában.
  • CS0450: Típusparaméter: nem adható meg mind a kényszerosztály, mind a classstruct kényszer.
  • CS0451: A new() kényszer nem használható a struct kényszerrel.
  • CS0452: A "típusnév" típusnak referenciatípusnak kell lennie ahhoz, hogy paraméternévként lehessen használni az általános típusban vagy az "általános" metódusban.
  • CS0453: A(z) „type name” típusnak nem nullázható értéktípusnak kell lennie ahhoz, hogy a(z) „generic” általános típus vagy metódus „parameter name” paramétereként használható legyen.
  • CS0454: Körkörös kényszerfüggőség, amely az 1. típusparamétert és a 2. típusparamétert foglalja magában.
  • CS0455: A típusparaméter örökli a "constraint1" és a "constraint2" ütköző kényszereket.
  • CS0456: Az "1. típusparaméter" típusparaméter "struct" kényszerrel rendelkezik, ezért az "1. típusparaméter" nem használható a 2. típusparaméter kényszereként.
  • CS0693: A típusparaméter neve megegyezik a külső típus "type" típusparaméterével.
  • CS0694: A típusparaméter neve megegyezik a tartalomtípus vagy metódus nevével.
  • CS0695: A "type" nem implementálhatja az "interface1" és a "interface2" paramétert is, mert egyesíthetnek egyes típusparaméter-helyettesítéseket.
  • CS0698: Az általános típus nem származhat típusból, mert attribútumosztály.
  • CS0699: Az "általános" nem definiálja az "azonosító" típusparamétert.
  • CS0701: Az "azonosító" nem érvényes korlátozás. A kényszerként használt típusnak interfésznek, nem lezárt osztálynak vagy típusparaméternek kell lennie.
  • CS0702: A kényszer nem lehet különleges osztály.
  • CS0703: Inkonzisztens akadálymentesség: a kényszer típusa kevésbé akadálymentes, mint a deklaráció.
  • CS0704: Nem végezhető nem virtuális tagkeresés a típusban, mert típusparaméter.
  • CS0706: Érvénytelen kényszertípus. A kényszerként használt típusnak interfésznek, nem lezárt osztálynak vagy típusparaméternek kell lennie.
  • CS0717: Statikus osztály: a statikus osztályok nem használhatók kényszerként.
  • CS0718: "típus":a statikus típusok nem használhatók típusargumentumként.
  • CS1720: A kifejezés mindig System.NullReferenceException értéket okoz, mert az "általános típus" alapértelmezett értéke null.
  • CS1763: A "paraméter" típusa "típus". A karakterlánctól eltérő referenciatípus alapértelmezett paraméterértéke csak null értékkel inicializálható.
  • CS1948: A "name" tartományváltozónak nem lehet ugyanaz a neve, mint egy metódustípus-paraméternek.
  • CS1960: Érvénytelen variancia-módosító. Csak az interfész- és delegálástípus-paraméterek adhatók meg variánsként.
  • CS1961: Érvénytelen variancia: A típusparaméternek kovariánsan érvényesnek kell lennie a típusra. A "típusparaméter" a contravariant.
  • CS3024: A(z) 'type' korlátozástípus nem CLS-kompatibilis.
  • CS7002: A generikus név váratlan használata.
  • CS8322: Nem adható át dinamikus típusú argumentum az általános helyi függvénynek a kikövetkzett típusargumentumokkal.
  • CS8375: Az "új()" kényszer nem használható a "nem felügyelt" kényszerrel.
  • CS8377: A(z) 'type' típusnak nem nullázható értéktípusnak kell lennie, beleértve a beágyazás bármely szintjén található összes mezőt is, hogy a(z) 'generic' általános típus vagy metódus 'parameter' paramétereként lehessen használni.
  • CS8379: Az "1. típusparaméter" típusparaméter "nem felügyelt" kényszerrel rendelkezik, ezért az "1. típusparaméter" nem használható a 2. típusparaméter kényszereként.
  • CS8380: "típus": nem adható meg mind a kényszerosztály, mind a "nem felügyelt" kényszer.
  • CS8387: A típusparaméter neve megegyezik a külső metódus "metódusának" típusparaméterével.
  • CS8389: A típusargumentum kihagyása az aktuális környezetben nem engedélyezett.
  • CS8427: Az enumerálások, osztályok és struktúrák nem deklarálhatók olyan felületen, amely "in" vagy "out" típusú paramétert ad meg.
  • CS8665: A metódus "metódus" egy "osztály" kényszert határoz meg a típusparaméter "típusparamétere" esetében, de a felülírt vagy explicit módon implementált metódus "típusparamétere" megfelelő típusparaméter nem referenciatípus.
  • CS8666: A(z) „method” metódus a(z) „type parameter” típusparaméterre „struct” megkötést ír elő, de a felülírt vagy explicit módon implementált „method” metódus megfelelő „type parameter” típusparamétere nem null értékű értéktípus.
  • CS8822: A metódus "metódus" egy "alapértelmezett" kényszert határoz meg a típusparaméter "típusparamétere" esetében, de a felülírt vagy explicit módon implementált metódus megfelelő típusparamétere hivatkozástípusra vagy értéktípusra van korlátozva.
  • CS8823: Az "alapértelmezett" korlátozás csak a felülbírálási és explicit felületi implementálási módszerekre érvényes.
  • CS8893: A "type" nem érvényes hívási konvenciótípus a "UnmanagedCallersOnly" esetében.
  • CS8894: A "type" paraméterként nem használható, és nem adható vissza típus a "UnmanagedCallersOnly" attribútumú metóduson.
  • CS8895: A "UnmanagedCallersOnly" attribútumú metódusok nem rendelkeznek általános típusparaméterekkel, és nem deklarálhatók általános típusban.
  • CS8896: A "UnmanagedCallersOnly" csak a hagyományos statikus, nem absztrakt, nem virtuális metódusokra vagy statikus helyi függvényekre alkalmazható.
  • CS9011: A kulcsszó delegate nem használható kényszerként. Úgy érted System.Delegate?
  • CS9012: Váratlan kulcsszó record. Úgy érted record struct , vagy record class?
  • CS9338: Inkonzisztens akadálymentesség: a típus kevésbé akadálymentes, mint az osztály.

Típusparaméter-deklaráció és elnevezés

  • CS0080: A nem általános deklarációkra vonatkozó korlátozások nem engedélyezettek.
  • CS0081: A típusparaméter-deklarációnak nem típusnak, hanem azonosítónak kell lennie.
  • CS0412: Paraméter: egy paraméter, helyi változó vagy helyi függvény nem rendelkezhet ugyanazzal a névvel, mint egy metódustípus-paraméter.
  • CS0693: A típusparaméter neve megegyezik a külső típus "type" típusparaméterével.
  • CS0694: A típusparaméter neve megegyezik a tartalomtípus vagy metódus nevével.
  • CS0699: Az "általános" nem definiálja az "azonosító" típusparamétert.
  • CS1948: A "name" tartományváltozónak nem lehet ugyanaz a neve, mint egy metódustípus-paraméternek.
  • CS8387: A típusparaméter neve megegyezik a külső metódus "metódusának" típusparaméterével.
  • CS9012: Váratlan kulcsszó record. Úgy érted record struct , vagy record class?

Ezek a hibák az általános típusok és metódusok deklarálási és névtípus-paramétereivel kapcsolatosak. A típusparaméter-neveknek érvényes azonosítóknak kell lenniük, nem ütközhetnek a hatókör többi azonosítójával, és meg kell jelenniük a deklaráció típusparaméter-listájában.

  • Távolítsa el a kényszer záradékot a nem általános deklarációkból (CS0080). A where záradék csak olyan általános típusokon és metódusokon használható, amelyek típusparamétereket deklarálnak. Ha kényszereket kell alkalmaznia, először adjon hozzá típusparamétereket a típus- vagy metódusdeklarációhoz.
  • Cserélje le a tényleges típusneveket a típusparaméter-deklarációkban (CS0081) szereplő azonosítókra. A típusparamétereket azonosítókkal (például T, TKey, vagy TValue) kell deklarálnia a konkrét típusok (például int vagy string) helyett. A típusparaméter célja, hogy helyőrzőként szolgáljon, amelyet a fordító a tényleges típusokkal helyettesít az általános típus vagy metódus használatakor.
  • Nevezze át a típusparamétereket, a helyi változókat, paramétereket vagy tartományváltozókat az elnevezési ütközések elkerülése érdekében (CS0412, CS0694, CS1948). A típusparaméterek nevei nem tartalmazhatnak árnyékazonosítókat ugyanabban a hatókörben, és nem egyeznek a típus vagy metódus nevét tartalmazó névvel. A LINQ-tartomány változói szintén nem használhatják fel a metódus típusparaméterének nevét. Az ilyen ütközések kétértelműséget okoznak azzal kapcsolatban, hogy melyik azonosítóra hivatkoznak.
  • Használjon másik nevet a külső árnyékolású belső típusú paraméterekhez (CS0693, CS8387). Ha egy általános tag (például metódus vagy beágyazott típus) egy általános osztályban vagy metódusban található, a belső típusparaméter nem feltétlenül ugyanaz, mint a külső. Ha ugyanazt a nevet adja nekik, az zavart okoz azzal kapcsolatban, hogy melyik típusparaméterre hivatkozik. Használjon külön nevet a belső típusparaméterhez.
  • Győződjön meg arról, hogy a kényszerfeltételek összes típusparamétere deklarálva van a típusparaméterek listájában (CS0699). A where záradékok csak az általános deklarációban megjelenő típusparaméterekre hivatkozhatnak. Ha a záradékban szereplő where név nem egyezik a deklarált típusparaméterekkel, ellenőrizze az elírásokat vagy a helyesírási hibákat.
  • Használja a megfelelő rekorddeklaráció szintaxisát (CS9012). Rekordtípus deklarálásakor vagy record class vagy record struct kell használnia (referenciatípus esetén pedig csak record). A record kulcsszó önmagában nem jelenhet meg olyan helyzetekben, ahol a fordító más deklarációs szintaxist vár.

További információ: Általános típusparaméterek és Általánosak.

Kényszer deklarálása és megrendelése

  • CS0401: A new() korlátozásnak az utolsó megadott korlátozó kényszernek kell lennie.
  • CS0406: A(z) 'constraint' osztálytípusra vonatkozó megkötésnek minden más megkötés előtt kell szerepelnie.
  • CS0409: A "típusparaméter" típusparaméterhez már meg van adva egy kényszerzáradék. A típusparaméterre vonatkozó összes korlátozást egyetlen hol záradékban kell megadni.
  • CS0449: A class, struct, unmanaged, notnullés default kényszerek nem kombinálhatók vagy duplikálhatók, és először meg kell adni a kényszerek listájában.
  • CS0450: Típusparaméter: nem adható meg mind a kényszerosztály, mind a classstruct kényszer.
  • CS0451: A new() kényszer nem használható a struct kényszerrel.
  • CS8375: Az "új()" kényszer nem használható a "nem felügyelt" kényszerrel.
  • CS8380: "típus": nem adható meg mind a kényszerosztály, mind a "nem felügyelt" kényszer.
  • CS9011: A kulcsszó delegate nem használható kényszerként. Úgy érted System.Delegate?

A típusparaméterekre vonatkozó korlátozásoknak meghatározott sorrendet kell követnie: először az elsődleges kényszerek (class, struct, , unmanaged, notnullvagy default) jönnek, majd egy osztálytípus-kényszer, majd a felületi kényszerek, végül pedig a new() konstruktori kényszer. Egyes korlátozások kölcsönösen kizárhatók, és nem kombinálhatók. Egyetlen típusparaméterre vonatkozó összes korlátozásnak egyetlen where záradékban kell megjelennie.

  • Helyezze a new() kényszert a kényszerlista végére (CS0401). A new() kényszernek az összes többi kényszer után kell megjelennie. Például váltson a where T : new(), IDisposable következőre where T : IDisposable, new(): .
  • Helyezze az osztálytípus-korlátozást az illesztőkorlátok elé (CS0406). Ha egy típusparamétert egy adott alaposztályra és illesztőkre korlátoz, először az osztálynak kell megjelennie. Például váltson a where T : IDisposable, MyBaseClass következőre where T : MyBaseClass, IDisposable: .
  • Egyesítse egy típusparaméter összes korlátozását egyetlen where záradékba (CS0409). Ugyanahhoz a típusparaméterhez nem használhat több where záradékot. Egyesítse őket egy mondatba: módosítsa ezt: where T : I where T : new() erre: where T : I, new(). Több where záradék csak akkor érvényes, ha különböző típusparamétereket céloznak meg.
  • Először helyezze el az elsődleges kényszereket, és ne egyesítse a kölcsönösen kizáró kényszereket (CS0449). Legfeljebb egy class, struct, unmanaged, notnullvagy default, megadható, és először meg kell jelennie a kényszerlistában. A class és struct korlátozások kölcsönösen kizárják egymást, ahogyan a class és unmanaged is.
  • Ne kombinálja a megadott osztálykorlátozást a(z) class, struct vagy unmanaged elemmel (CS0450, CS8380). Ha egy típusparaméter egy adott osztálytípusra van megkötve, akkor implicit módon referenciatípusnak minősül, ami ellentmond a struct vagy unmanaged megkötésnek. Távolítsa el az osztálykényszert vagy az elsődleges kényszert.
  • Ne kombinálja a(z) new() elemet a(z) struct vagy unmanaged elemmel (CS0451, CS8375). Minden értéktípus implicit módon nyilvános paraméter nélküli konstruktorral rendelkezik, így a new() kényszer redundáns, ha kombinálva van a .struct Ugyanez vonatkozik a(z) unmanaged elemre is, amiből struct következik. Távolítsa el a new() kényszert.
  • Cserélje le delegate a System.Delegate megkötési záradékokban (CS9011). A delegate kulcsszó a deklarált típusok deklarálásához használatos, nem kényszerként. Ha a típusparamétert a típusok delegálására szeretné korlátozni, használja System.Delegate kényszertípusként.

További információ: Típusparaméterek korlátozásai.

Érvényes kényszertípusok

  • CS0405: Ismétlődő kényszer a típusparaméterhez.
  • CS0701: Az "azonosító" nem érvényes korlátozás. A kényszerként használt típusnak interfésznek, nem lezárt osztálynak vagy típusparaméternek kell lennie.
  • CS0702: A kényszer nem lehet különleges osztály.
  • CS0703: Inkonzisztens akadálymentesség: a kényszer típusa kevésbé akadálymentes, mint a deklaráció.
  • CS0706: Érvénytelen kényszertípus. A kényszerként használt típusnak interfésznek, nem lezárt osztálynak vagy típusparaméternek kell lennie.
  • CS0717: Statikus osztály: a statikus osztályok nem használhatók kényszerként.
  • CS3024: A(z) „type” kényszertípus nem CLS-kompatibilis.

A kényszernek interfésznek, nem lezárt osztálynak vagy típusparaméternek kell lennie. Bizonyos típusok kényszerként érvénytelenek a .NET-típusrendszer speciális jelentése miatt, vagy azért, mert nem örökölhetők.

  • Távolítsa el az ismétlődő korlátozásokat (CS0405). Minden kényszer csak egyszer jelenhet meg egy kényszer záradékban. Ha így van where T : I, I, távolítsa el a duplikált példányt.
  • Csak nem lezárt típusokat használjon korlátozásként (CS0701). A lezárt osztályok, szerkezetek és enumerálások nem örökölhetők, ezért nem szolgálnak kényszerként. Használjon olyan felületet, amelyet a kívánt típusok megvalósítanak, vagy használjon nem lezárt alaposztályt.
  • Ne használjon speciális osztályokat kényszerként (CS0702). A típusok Object, Arrayés ValueType nem használhatók kényszerként. Minden típus már származik belőle Object, ezért a korlátozás nem ad értéket. Array és ValueType olyan absztrakt alaptípusok, amelyek közvetlenül nem örökölhetők. Ha tömbszerű viselkedésre van szüksége, használja IList<T> vagy IEnumerable<T> helyette.
  • Győződjön meg arról, hogy a korlátok legalább olyan hozzáférhetők, mint az általános típus (CS0703). A nyilvános általános típusok nem tartalmazhatnak belső típusokat használó korlátozásokat, mert a külső kód nem tud érvényes típusargumentumokat megadni. Tegye nyilvánossá a kényszertípust, vagy csökkentse az általános típus hozzáférhetőségét.
  • Csak interfészeket, nem lezárt osztályokat vagy típusparamétereket használjon kényszerként (CS0706). Nem használhat tömböket, lezárt osztályokat, szerkezeteket, számokat vagy más érvénytelen típusokat kényszerként. Fontolja meg a kívánt típusok által implementálható felület használatát.
  • Ne használjon statikus osztályokat kényszerként (CS0717). A statikus osztályok nem bővíthetők, mert csak statikus tagokat tartalmaznak. Egyetlen típus sem származhat statikus osztályból, így kényszerként használhatatlanná teszi.
  • Használjon CLS-kompatibilis típust a típusmegkötéshez (CS3024). Ha egy szerelvény [assembly: CLSCompliant(true)] attribútummal van megjelölve, akkor egy nem CLS-kompatibilis típus általános típuskorlátozásként való használata lehetetlenné teheti, hogy egyes programozási nyelveken írt kód felhasználja az Ön általános osztályát.

További információ: Típusparaméterek korlátozásai.

Kényszer-elégedettség és konverziók

  • CS0311: A típus nem használható típusparaméterként T az általános típusban vagy metódusban. Az 1. típusról a "type2" típusra történő implicit referenciaátalakítás nem történik.
  • CS0312: A típus nem használható típusparaméterként a generikus típusban vagy metódusban. A null értéket is felvevő típus nem felel meg a(z) „constraint” megszorításnak.
  • CS0313: A típus nem használható típusparaméterként a generikus típusban vagy metódusban. A null értéket is felvevő típus nem felel meg a(z) 'constraint' megkötésnek. A null értéket is felvevő típusok nem felelhetnek meg semmilyen interfészre vonatkozó megkötésnek.
  • CS0314: A típus nem használható típusparaméterként a generikus típusban vagy metódusban. Nincs boxingkonverzió vagy típusparaméter-konverzió a(z) „type” típusról a(z) „constraint” típusra.
  • CS0315: A típus nem használható típusként a(z) T típusparaméterhez a generikus típusban vagy metódusban. Nincs becsomagolási átalakítás a(z) „type” típusról a(z) „constraint” megszorításra.
  • CS0452: A "típusnév" típusnak referenciatípusnak kell lennie ahhoz, hogy paraméternévként lehessen használni az általános típusban vagy az "általános" metódusban.
  • CS0453: A(z) 'type name' típusnak nem nullázható értéktípusnak kell lennie ahhoz, hogy 'parameter name' paraméterként lehessen használni a(z) 'generic' általános típusban vagy metódusban.
  • CS8377: A(z) 'type' típusnak nem nullázható értéktípusnak kell lennie, valamint a beágyazás bármely szintjén található összes mezőjének is annak kell lennie ahhoz, hogy a(z) 'generic' generikus típusban vagy metódusban 'parameter' paraméterként lehessen használni.

Ezek a hibák akkor fordulnak elő, ha egy típusargumentum nem felel meg az általános típusparaméteren deklarált korlátozásoknak. A típusargumentumnak a megfelelő átalakításokkal, öröklési kapcsolatokkal és szerkezeti tulajdonságokkal kell rendelkeznie, hogy megfeleljenek az összes korlátozásnak.

  • Módosítsa a típusargumentumot olyanra, amely implicit hivatkozási átalakítással rendelkezik a kényszertípusra (CS0311). Ha egy típusparaméterhez hasonló where T : BaseTypekényszer van, minden típusargumentumnak implicit referenciakonvertálással vagy identitásátalakítással konvertálhatónak BaseType kell lennie. Az implicit numerikus konverziók (például short típusról int típusra) nem felelnek meg a generikus típusparaméterekre vonatkozó korlátozásoknak.
  • Használjon nem null értékű értéktípusokat, vagy módosítsa a kényszer típusát (CS0312, CS0313). A null értékű értéktípusok (például int?) különböznek a mögöttes értéktípusoktól, és nem felelnek meg ugyanazoknak a korlátozásoknak. A null értékű értéktípusok nem képesek kielégíteni az interfészre vonatkozó korlátozásokat, mert maga a null értékű burkoló nem implementálja az interfészt. Az értéktípus nem null értékű formáját használja típusargumentumként.
  • Ismételje meg az alaposztály típusparaméter-korlátozásait bármely származtatott osztálydeklarációban (CS0314). Ha egy származtatott általános osztály korlátozott alapszintű általános osztálytól öröklődik, a származtatott osztálynak ugyanazokat a korlátozásokat kell deklarálnia a megfelelő típusparamétereken.
  • Győződjön meg arról, hogy a típusargumentumok megfelelnek a referenciatípusnak vagy az osztálykorlátoknak (CS0315). Ha egy típusparaméter egy osztálytípusra van korlátozva, nem használhat értéktípust (struct) típusargumentumként, mert nincs olyan boxing konverzió, amely megfelel a kényszerkapcsolatnak. Olyan referenciatípust használjon, amely örökli vagy megvalósítja a kényszert.
  • A(z) class megkötés megadásakor referenciatípust használjon típusargumentumként (CS0452). Az olyan értéktípusok, mint a(z) struct vagy int, nem felelhetnek meg egy class megkötésnek. Módosítsa a típusargumentumot hivatkozástípusra, vagy távolítsa el a class kényszert, ha az általános típus képes értéktípusokkal dolgozni.
  • A kényszer megadásakor struct használjon nem null értékű értéktípust típusargumentumként (CS0453). A hivatkozástípusok, a null értékű értéktípusok (int?) és az egyéb nem értéktípusok nem felelnek meg a kényszernek struct . Használjon konkrét, nem null értékű értéktípust, például int, doublevagy felhasználó által definiált structértéket.
  • Olyan típust használjon, amelynek mezői mind nem felügyelt típusok a unmanaged kényszer megadásakor (CS8377). A unmanaged kényszerhez nem null értékű értéktípusra van szükség, ahol minden mező a beágyazás minden szintjén szintén nem felügyelt típus. A nem felügyelt referencia típusú mezőket vagy általános típusparamétereket tartalmazó típusok nem felelnek meg ennek a kényszernek.

További információ: Típusparaméterek korlátozásai.

Kényszerütközések és körkörös függőségek

  • CS0454: Körkörös kényszerfüggőség, amely az 1. típusparamétert és a 2. típusparamétert foglalja magában.
  • CS0455: A típusparaméter örökli a "constraint1" és a "constraint2" ütköző kényszereket.
  • CS0456: Az "1. típusparaméter" típusparaméter "struct" kényszerrel rendelkezik, ezért az "1. típusparaméter" nem használható a 2. típusparaméter kényszereként.
  • CS8379: Az "1. típusparaméter" típusparaméter "nem felügyelt" kényszerrel rendelkezik, ezért az "1. típusparaméter" nem használható a 2. típusparaméter kényszereként.

A kényszerek nem hozhatnak létre körkörös függőségeket, és a típusparaméterek nem örökölhetnek ütköző kényszereket, amelyeket nem lehet egyszerre kielégíteni. Az értéktípus-megkötések (struct és unmanaged) implicit módon vannak lezárva, így nem használhatók más típusparaméterekre vonatkozó korlátozásokként.

  • Körkörös kényszerfüggőségek (CS0454) eltávolítása. A típusparaméterek nem függhetnek közvetlenül vagy közvetve saját maguktól a megkötéseken keresztül. Létrehozhat például where T : U where U : T egy körkörös függőséget. Az egyik korlátozás eltávolításával megszakíthatja a ciklust.
  • Az ütköző öröklődő kényszerek (CS0455) eltávolítása. Egy típusparaméter nem korlátozható több nem kapcsolódó osztályra, mert a C# nem támogatja a több osztályöröklést. Hasonlóképpen, nem korlátozható egyszerre a struct és egy osztálytípusra. Strukturálja át a típushierarchiát, vagy távolítsa el az ütköző kényszerek egyikét.
  • Ne használjon struct-korlátozott vagy unmanaged-korlátozott típusparamétert egy másik típusparaméter (CS0456, CS8379) kényszereként. Az értéktípus-megkötések implicit módon vannak lezárva, így más típus nem származhat belőlük. A hiba megoldásához helyezze az értéktípust vagy a nem felügyelt kényszert közvetlenül a második típusparaméterre ahelyett, hogy közvetett módon korlátozta volna az első típusparaméteren keresztül.

További információ: Típusparaméterek korlátozásai.

Felülbírálási és megvalósítási kényszerszabályok

  • CS8665: A metódus "metódus" egy "osztály" kényszert határoz meg a típusparaméter "típusparamétere" esetében, de a felülírt vagy explicit módon implementált metódus "típusparamétere" megfelelő típusparaméter nem referenciatípus.
  • CS8666: A(z) „method” metódus „struct” megkötést ad meg a(z) „type parameter” típusparaméterhez, de a felülbírált vagy explicit módon implementált „method” metódus megfelelő „type parameter” típusparamétere nem nem nullázható értéktípus.
  • CS8822: A metódus "metódus" egy "alapértelmezett" kényszert határoz meg a típusparaméter "típusparamétere" esetében, de a felülírt vagy explicit módon implementált metódus megfelelő típusparamétere hivatkozástípusra vagy értéktípusra van korlátozva.
  • CS8823: Az "alapértelmezett" korlátozás csak a felülbírálási és explicit felületi implementálási módszerekre érvényes.

Ha felülbírál egy virtuális metódust, vagy explicit módon implementál egy interfészmetódust, a felülbíráló metódus típusparamétereinek korlátozásainak kompatibilisnek kell lenniük az alapmetódus korlátaival. A default megkötés egy speciális módosító, amelyet csak felülbírálás és interfész explicit megvalósítása esetén használnak annak jelzésére, hogy egy típusparaméterhez nincs megadva sem class, sem struct megkötés.

  • Győződjön meg arról, hogy a felülíró metódus megkötései megegyeznek az alapmetódus korlátaival (CS8665, CS8666). A felüldefiniálás nem adhat hozzá class megkötést, ha az alapmetódus megfelelő típusparamétere nincs referenciatípusra korlátozva. Hasonlóképpen nem tud kényszert struct hozzáadni, ha az alapmetódus típusparamétere nincs értéktípusra korlátozva. A felülbírálásnak kompatibilisnek kell lennie az alapdeklarációval.
  • A korlátozást default csak akkor használja, ha az alapmetódus típusparamétere nincs korlátozva (CS8822). A default kényszer azt jelzi, hogy a típusparaméternek nincs class vagy struct kényszere. Nem alkalmazható a(z) default, ha a felülbírált metódus megfelelő típusparamétere már rendelkezik class vagy struct megkötéssel.
  • A default korlátozást csak felülíró vagy explicit interfészmegvalósítási metódusokon használja (CS8823). A default korlátozás nem érvényes a rendszeres metódusdeklarációkra. Kifejezetten azért létezik, hogy egyértelműsítse egy olyan metódus felülbírálásakor, ahol az alap nem korlátozott típusparaméterrel rendelkezik, és azt kell jeleznie, hogy a felülbírálás azt is korlátozás nélkül hagyja.

További információ: A típusparaméterekre és a default kényszerre vonatkozó korlátozások.

Konstruktor-korlátozások

  • CS0304: Nem hozható létre a változótípus egy példánya, mert nincs megkötése new() .
  • CS0310: A típusnak nem absztrakt típusúnak kell lennie egy nyilvános paraméter nélküli konstruktorral ahhoz, hogy paraméterként használhassa az általános típusban vagy metódusban.
  • CS0417: Azonosító: nem adható meg argumentum egy változótípusú példány létrehozásakor.

Ezek a hibák a new() megszorításhoz és a típusparaméterek new operátorral történő példányosításához kapcsolódnak.

  • Adja hozzá a(z) new() megkötést azokhoz a típusparaméterekhez, amelyeket példányosítania kell (CS0304). Ha általános típuson vagy metóduson belül használja new T() , a fordítónak garantálnia kell, hogy bármely típusargumentum paraméter nélküli konstruktort használjon. A new() korlátozás ezt a garanciát biztosítja.
  • Győződjön meg arról, hogy a típusargumentumok nyilvános paraméter nélküli konstruktorokkal (CS0310) rendelkeznek. Ha egy típusparaméter rendelkezik a new() korlátozással, a típusargumentumként használt bármely konkrét típusnak nem absztraktnak kell lennie, és nyilvános paraméter nélküli konstruktort kell biztosítania. A csak privát, védett vagy paraméteres konstruktorokkal rendelkező típusok nem tudják kielégíteni a kényszert new() .
  • A típusparaméterek (CS0417) példányosításakor távolítsa el a konstruktorargumentumokat. A new() kényszer csak paraméter nélküli konstruktort garantál. Nem adhat át paramétereket a(z) new T(arguments) elemnek. Ha adott argumentumokkal kell létrehoznia példányokat, fontolja meg egy gyári minta vagy egy interfészkényszer használatát, amely meghatározza az építési viselkedést.

További információ: A típusparaméterekre és a new() kényszerre vonatkozó korlátozások.

Típusargumentumok száma és használata

  • CS0224: Egy vararg metódus nem lehet általános, nem lehet egy általános típusban, és nem rendelkezhet params paraméterrel.
  • CS0305: Az általános típus használatához N típusú argumentumokra van szükség.
  • CS0306: A típus nem használható típusargumentumként.
  • CS0307: Az azonosító nem használható típusargumentumokkal.
  • CS0308: A nem általános típus- vagy metódus nem használható típusargumentumokkal.
  • CS7002: Generikus név váratlan használata.
  • CS8389: A típusargumentum kihagyása az aktuális környezetben nem engedélyezett.

Ezek a hibák azzal kapcsolatosak, hogy a megfelelő számú és típusú argumentumot adja meg az általános típusoknak és metódusoknak.

  • Távolítsa el az általános típusparamétereket vagy általános típusdeklarációkat a használt __arglist metódusokból (CS0224). A __arglist kulcsszó nem kompatibilis az általánosakkal, mert a változó argumentumok kezelésére szolgáló futtatókörnyezeti mechanizmusok ütköznek az általános típusparaméterekhez szükséges típushelyettesítéssel.
  • Adja meg az általános deklarációban (CS0305) megadott típusargumentumok pontos számát. A definícióban szereplő összes általános típusparaméternek megfelelő típusargumentumot kell tartalmaznia az általános típus példányosításakor.
  • Csak érvényes típusokat használjon típusargumentumként (CS0306). A mutatótípusok (például int* vagy char*) nem használhatók típusargumentumként, mert az általános típusok olyan felügyelt típusokat igényelnek, amelyeket a szemétgyűjtő nyomon tud követni.
  • Távolítsa el a típusargumentum szintaxisát a nem általános szerkezetekből (CS0307, CS0308). A szögletes zárójelek közé zárt típusargumentumok csak a típusparamétereket deklaráló általános típusokra és metódusokra alkalmazhatók. Győződjön meg arról, hogy importálta a típus általános verzióját tartalmazó névteret.
  • Távolítsa el a típusparamétereket az általánosakat nem támogató deklarációkból (CS7002). Egyes szerkezetek, például az enumerálások nem lehetnek általánosak. Ha általános tárolóra van szüksége az enumerálási értékekhez, fontolja meg inkább egy általános osztály vagy struktúra használatát.
  • Adja meg az összes kötelező típusargumentumot explicit módon (CS8389). Bizonyos környezetekben, például az operátor használata vagy a typeof meghatalmazottak létrehozása esetén meg kell adnia az összes típusargumentumot, és nem hagyhatja ki őket. Használja például a typeof(List<int>) elemet ahelyett, hogy megpróbálná elhagyni a típusargumentumot.

További információ: Általános típusparaméterek és Általánosak.

Típusargumentum-következtetés

  • CS0411: A metódus típusargumentumai nem vonhatók ki a használatból. Próbálja meg explicit módon megadni a típusargumentumokat.

Ez a hiba akkor fordul elő, ha általános metódust hív meg a típusargumentumok explicit megadása nélkül, és a fordító nem tudja következtetni, hogy melyik típusargumentumokat szeretné használni. A fordító a hívás helyén átadott metódusargumentumok típusaiból következtet a típusargumentumokra.

  • Adja meg a típusargumentumokat kifejezetten szögletes zárójelekben (CS0411). Ha a fordító nem tudja meghatározni a metódusargumentumok típusargumentumait, adja meg őket közvetlenül. Például váltson a G() következőre G<int>(): . Ez a hiba általában akkor fordul elő, ha egy általános metódus nem rendelkezik olyan paraméterekkel, amelyekből következtethet a típusra, vagy ha null argumentumot ad át, és a fordító nem tudja meghatározni a kívánt típust.

További információ: Általános metódusok.

Típusparaméter varianciája

  • CS1960: Érvénytelen variancia-módosító. Csak az interfész- és delegálástípus-paraméterek adhatók meg variánsként.
  • CS1961: Érvénytelen variancia: A típusparaméternek kovariánsan érvényesnek kell lennie a típusra. A "típusparaméter" a contravariant.
  • CS8427: Az enumerálások, osztályok és struktúrák nem deklarálhatók olyan felületen, amely "in" vagy "out" típusú paramétert ad meg.

A varianciamódosítók (in a kontravariancia, out a kovariancia esetén) azt szabályozzák, hogy miként használhatja a típusparamétereket az interfész- és delegáltdeklarációkban. Csak a felületek és a delegáltak támogatják a varianciát. A covariant (out) típusú paraméter csak kimeneti pozíciókban (visszatérési típusok) jelenhet meg, míg a contravariant (in) típusú paraméter csak bemeneti pozíciókban (paramétertípusokban) jelenhet meg.

  • Varianciamódosítókat csak interfész- és delegálástípus-paramétereken (CS1960) használjon. Az osztályok, a szerkezetek és az egyéb típusdeklarációk nem támogatják a varianciamódosítókat. Csak a(z) interface és delegate deklarációk használhatják a(z) in vagy out elemet a típusparamétereiken.
  • Olyan típusparaméterek esetén használja out (kovariant), amelyek csak a visszatérési típusok között jelennek meg, és in (contravariant) olyan típusparaméterekhez, amelyek csak paramétertípusokban (CS1961) jelennek meg. Ha a típusparaméternek mind a bemeneti, mind a kimeneti pozícióban meg kell jelennie, távolítsa el a variancia-módosító értékét.
  • Ne deklaráljon számokat, osztályokat vagy struktúrákat egy variáns interfészen belül (CS8427). A beágyazott típusdeklarációk nem engedélyezettek olyan interfészen belül, amely rendelkezik vagy in típusparaméterekkel rendelkezikout, mert megsérthetik a variancia-biztonsági szabályokat. Helyezze át a beágyazott típust a felületi deklaráción kívülre.

További információ: Kovariancia és kontravariancia az általános típusokban.

Általános típushasználati korlátozások

  • CS0403: A null érték nem konvertálható típusparaméterré, mert lehet, hogy nem nullálható értéktípus. Fontolja meg a default(T) használatát.
  • CS0413: A típusparaméter nem használható az as operátorral, mert nem rendelkezik osztálytípus-korlátozással vagy kényszerrel class .
  • CS0695: A "type" nem implementálhatja az "interface1" és a "interface2" paramétert is, mert egyesíthetnek egyes típusparaméter-helyettesítéseket.
  • CS0698: Az általános típus nem származhat típusból, mert attribútumosztály.
  • CS0704: Nem végezhető nem virtuális tagkeresés a(z) 'type' típusban, mert az egy típusparaméter.
  • CS0718: "típus":a statikus típusok nem használhatók típusargumentumként.
  • CS1720: A kifejezés mindig System.NullReferenceException értéket okoz, mert az "általános típus" alapértelmezett értéke null.
  • CS1763: A "paraméter" típusa "típus". A karakterlánctól eltérő referenciatípus alapértelmezett paraméterértéke csak null értékkel inicializálható.
  • CS8322: Nem adható át dinamikus típusú argumentum az általános helyi függvénynek a kikövetkzett típusargumentumokkal.
  • CS9338: Inkonzisztens akadálymentesség: a típus kevésbé akadálymentes, mint az osztály.

Ezek a hibák arra vonatkoznak, hogy az általános típus- és típusparaméterek hogyan használhatók kifejezésekben, öröklésben és taghozzáférésben.

  • Cserélje le a null hozzárendeléseket default(T) típusra, vagy adjon hozzá egy class kényszert (CS0403). Ha nem szabályozott típusparaméterhez rendel hozzá null , a fordító nem tudja garantálni, hogy a típusargumentum hivatkozástípus. Használja a default(T) elemet, amely bármely típushoz a megfelelő alapértelmezett értéket biztosítja, vagy adjon hozzá egy class megkötést, ha kifejezetten referenciatípusokra jellemző szemantikára van szüksége.
  • Adjon hozzá egy vagy konkrét típuskorlátozást class az as operátor (CS0413) használatakor. Az as operátor akkor ad null vissza, ha az átalakítás sikertelen, de az értéktípusok nem lehetnek null. Adjon hozzá egy korlátozást class , hogy a típusparaméter mindig referenciatípus legyen.
  • Kerülje ugyanazt az általános felületet többször is olyan típusparaméterekkel, amelyek egyesíthetnek (CS0695). Ha egy osztály több alkalommal implementál egy általános felületet különböző típusparaméterekkel (például class G<T1, T2> : I<T1>, I<T2>), az azonos típusú példányosítás mindkét paraméter esetében ütközést okoz. A felületet csak egyszer implementálhatja, vagy átstrukturálhatja az egyesítés megakadályozása érdekében.
  • Távolítsa el az általános típusparamétereket az attribútumosztályokból (CS0698). Ez a hiba már nem jelenik meg a C# jelenlegi verzióiban, mivel az általános attribútumok mostantól támogatottak.
  • A beágyazott taghozzáférés (CS0704) típusparamétere helyett használja a konkrét kényszertípust. Nem férhet hozzá beágyazott típusokhoz vagy nem virtuális tagokhoz egy típusparaméteren keresztül. A(z) T.InnerType helyett használja közvetlenül az ismert megkötéstípust, például a(z) BaseClass.InnerType elemet.
  • Ne használjon statikus típusokat típusargumentumként (CS0718). A statikus típusok nem hozhatók létre, és nem használhatók általános argumentumként. Távolítsa el a statikus típust az általános argumentumból.
  • Kerülje a példánytagok default(T) meghívását, ha T hivatkozástípusra (CS1720) van korlátozva. Ha a(z) Tclass megkötéssel rendelkezik, a(z) default(T)null, így a példánytagok rajta való meghívása mindig NullReferenceException kivételt eredményez. Adjon hozzá nullérték-ellenőrzést a tagok meghívása előtt, vagy alakítsa át a kódot úgy, hogy elkerülje a default(T) közvetlen használatát.
  • Használja null alapértelmezett paraméterértékként olyan választható paramétereknél, amelyek típusa referenciatípus (CS1763). Ha egy általános metódus típusparaméterrel T rendelkezik, és T referenciatípus, cserélje le default(U)null, mert az opcionális paraméter alapértelmezett értékének fordítási időállandóknak kell lenniük, és default(T) nem oldja meg ezt a követelményt.
  • Adja meg a típusargumentumokat, amikor dinamikus értékeket ad át az általános helyi függvényeknek (CS8322). Amikor egy általános helyi függvénynek ad át dynamic argumentumot, a fordító nem tud típusargumentumokat kikövetkeztetni. Explicit módon adja meg a típusargumentumot, vagy adja meg a dinamikus értéket.
  • Győződjön meg arról, hogy a nyilvános vagy védett szignatúrákban használt típusargumentumok legalább olyan hozzáférhetők, mint az adott tag (CS9338). A nyilvános általános tagoknak nyilvánosan elérhető típusargumentumokat kell használniuk. Tegye nyilvánossá a típusargumentumot, vagy csökkentse a tag hozzáférhetőségét.

További információ: Típusparaméterek és alapértelmezett értékkifejezések korlátozásai.

UnmanagedCallersOnly Korlátozások

  • CS8893: A "type" nem érvényes hívási konvenciótípus a "UnmanagedCallersOnly" esetében.
  • CS8894: A "type" paraméterként nem használható, és nem adható vissza típus a "UnmanagedCallersOnly" attribútumú metóduson.
  • CS8895: A "UnmanagedCallersOnly" attribútumú metódusok nem rendelkeznek általános típusparaméterekkel, és nem deklarálhatók általános típusban.
  • CS8896: A "UnmanagedCallersOnly" csak a hagyományos statikus, nem absztrakt, nem virtuális metódusokra vagy statikus helyi függvényekre alkalmazható.

Az UnmanagedCallersOnlyAttribute attribútum olyan metódusokat jelöl, amelyeket a nem felügyelt kód hívhat meg. Ezek a metódusok szigorú követelményekkel rendelkeznek, mert a futtatókörnyezetnek kezelnie kell a felügyelt és a nem felügyelt hívási konvenciók közötti átmenetet.

  • Csak érvényes hívási konvenciótípusokat használjon az UnmanagedCallersOnly attribútumban (CS8893). Az attribútum CallConvs tulajdonsága csak a(z) System.Runtime.CompilerServices névtérből származó felismert hívási konvenciótípusokat fogadja el.
  • Csak blittelhető típusokat használjon paraméter- és visszatérési típusként (CS8894). A UnmanagedCallersOnly jelöléssel ellátott metódusok nem használhatnak felügyelt típusokat (például string vagy object) paraméter- vagy visszatérési típusként, mert a nem felügyelt hívók nem tudják kezelni a szemétgyűjtő által kezelt hivatkozásokat.
  • Távolítsa el az általános típusparamétereket a metódusokból UnmanagedCallersOnly , és ne deklarálja őket általános típusokban (CS8895). A nem felügyelt hívási konvenciók nem támogatják az általánosakat, mert a futtatókörnyezet nem tudja meghatározni az általános típusú helyettesítések megfelelő hívási konvencióját.
  • Csak a szokásos statikus, nem absztrakt, nem virtuális metódusokra vagy statikus helyi függvényekre (UnmanagedCallersOnly) alkalmazható. A példánymetódusok, az absztrakt metódusok és a virtuális metódusok nem jelölhetők meg UnmanagedCallersOnly , mert a nem felügyelt hívók nem tudják végrehajtani azokat a diszpécselési mechanizmusokat, amelyeket ezek a metódusok igényelnek.

További információért lásd UnmanagedCallersOnlyAttribute.