Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel worden de volgende compilerfouten behandeld:
- CS0080: Beperkingen zijn niet toegestaan voor niet-algemene declaraties.
- CS0081: Typeparameterdeclaratie moet een id zijn die geen type is.
- CS0224: Een methode met vararg kan niet algemeen zijn, zich in een algemeen type bevinden of een parameter params hebben.
-
CS0304: Kan geen exemplaar van het variabeletype maken omdat deze niet de
new()beperking heeft. - CS0305: Voor het gebruik van het algemene type zijn N-typeargumenten vereist.
- CS0306: Het type kan niet worden gebruikt als een typeargument.
- CS0307: De id kan niet worden gebruikt met typeargumenten.
- CS0308: Het niet-algemene type-of-methode kan niet worden gebruikt met typeargumenten.
- CS0310: Het type moet een niet-abstract type zijn met een openbare parameterloze constructor om dit te kunnen gebruiken als parameter in het algemene type of de methode.
-
CS0311: Het type kan niet worden gebruikt als typeparameter
Tin het algemene type of de methode. Er is geen impliciete verwijzingsconversie van 'type1' naar 'type2'. - CS0312: Het type 'type1' kan niet worden gebruikt als typeparameter in het algemene type of de methode. Het null-type 'type1' voldoet niet aan de beperking van 'constraint'.
- CS0313: Het type 'type1' kan niet worden gebruikt als typeparameter in het algemene type of de methode. Het null-type 'type1' voldoet niet aan de beperking van 'constraint'. Null-typen kunnen niet voldoen aan interfacebeperkingen.
- CS0314: Het type kan niet worden gebruikt als typeparameter in het algemene type of de methode. Er is geen boksconversie of typeparameterconversie van 'type' naar 'constraint'.
-
CS0315: Het type kan niet worden gebruikt als typeparameter
Tin het algemene type of de methode. Er is geen boksconversie van 'type' naar 'beperking'. -
CS0401: De
new()beperking moet de laatste beperkende beperking zijn opgegeven. -
CS0403: Kan null niet converteren naar typeparameter omdat het een niet-null-waardetype kan zijn. Overweeg in plaats daarvan te gebruiken
default(T). - CS0405: Dubbele beperking voor typeparameter.
- CS0406: De beperking van het klassetype 'constraint' moet vóór eventuele andere beperkingen komen.
- CS0409: Er is al een beperkingscomponent opgegeven voor de typeparameter 'typeparameter'. Alle beperkingen voor een typeparameter moeten worden opgegeven in één where-component.
- CS0411: De typeargumenten voor methode 'methode' kunnen niet worden afgeleid van het gebruik. Geef expliciet de typeargumenten op.
- CS0412: Parameter: een parameter, lokale variabele of lokale functie mag niet dezelfde naam hebben als een parameter van het methodetype.
-
CS0413: De typeparameter kan niet worden gebruikt met de
asoperator omdat deze geen klassetypebeperking of eenclassbeperking heeft. - CS0417: Kenmerk: kan geen argumenten opgeven bij het instantiëren van een variabele-type.
-
CS0449: De
classbeperkingen ,struct,unmanagedennotnulldefaultbeperkingen kunnen niet worden gecombineerd of gedupliceerd en moeten eerst worden opgegeven in de lijst met beperkingen. -
CS0450: Type parameter: kan niet zowel een beperkingsklasse als de
classofstructbeperking opgeven. -
CS0451: De
new()beperking kan niet worden gebruikt met destructbeperking. - CS0452: Het type 'typenaam' moet een verwijzingstype zijn om dit te kunnen gebruiken als parameter 'parameternaam' in het algemene type of de methode 'generic'.
- CS0453: Het type 'typenaam' moet een niet-null-waardetype zijn om dit te kunnen gebruiken als parameter 'parameternaam' in het algemene type of de methode 'generic'.
- CS0454: Afhankelijkheid van kringbeperking met typeparameter 1 en typeparameter 2.
- CS0455: De parameter Type neemt conflicterende beperkingen 'constraint1' en 'constraint2' over.
- CS0456: Type parameter 'type parameter 1' heeft de beperking 'struct' zodat 'type parameter 1' niet kan worden gebruikt als een beperking voor 'type parameter 2'.
- CS0693: Type parameter 'type parameter' heeft dezelfde naam als de typeparameter van het buitenste type 'type'.
- CS0694: De parameter Type heeft dezelfde naam als het type of de methode die het bevat.
- CS0695: 'type' kan niet zowel 'interface1' als 'interface2' implementeren, omdat ze mogelijk worden samenvervangen voor bepaalde typeparametervervangingen.
- CS0698: Een algemeen type kan niet worden afgeleid van het type omdat het een kenmerkklasse is.
- CS0699: 'generic' definieert geen typeparameter 'id'.
- CS0701: 'id' is geen geldige beperking. Een type dat als beperking wordt gebruikt, moet een interface, een niet-verzegelde klasse of een typeparameter zijn.
- CS0702: Beperking kan geen speciale klasse zijn.
- CS0703: Inconsistente toegankelijkheid: het restrictietype is minder toegankelijk dan de declaratie.
- CS0704: Kan geen opzoekactie voor niet-virtuele leden uitvoeren in 'type' omdat het een typeparameter is.
- CS0706: Ongeldig beperkingstype. Een type dat als beperking wordt gebruikt, moet een interface, een niet-verzegelde klasse of een typeparameter zijn.
- CS0717: Statische klasse: statische klassen kunnen niet als beperkingen worden gebruikt.
- CS0718: 'type': statische typen kunnen niet worden gebruikt als typeargumenten.
- CS1720: Expressie veroorzaakt altijd een System.NullReferenceException omdat de standaardwaarde van 'generic type' null is.
- CS1763: 'parameter' is van het type 'type'. Een standaardparameterwaarde van een ander verwijzingstype dan tekenreeks kan alleen worden geïnitialiseerd met null.
- CS1948: De bereikvariabele 'name' mag niet dezelfde naam hebben als een parameter voor het methodetype.
- CS1960: Ongeldige variantiemodificator. Alleen interface- en delegate-typeparameters kunnen als variant worden opgegeven.
- CS1961: Ongeldige variantie: de typeparameter moet covariant geldig zijn voor 'type'. 'typeparameter' is contravariant.
- CS3024: Beperkingstype 'type' is niet CLS-compatibel.
- CS7002: Onverwacht gebruik van een algemene naam.
- CS8322: Kan argument met dynamisch type niet doorgeven aan algemene lokale functie met afgeleide typeargumenten.
- CS8375: De beperking 'new()' kan niet worden gebruikt met de beperking Onbeheerd.
- CS8377: Het type 'type' moet een waardetype zijn dat geen null-waarde kan hebben, evenals alle velden op elk nestingniveau, om als parameter 'parameter' te kunnen worden gebruikt in het generieke type of de generieke methode 'generic'.
- CS8379: Type parameter 'type parameter 1' heeft de beperking 'unmanaged' zodat 'type parameter 1' niet kan worden gebruikt als een beperking voor 'type parameter 2'.
- CS8380: 'type': kan niet zowel een beperkingsklasse als de beperking 'niet-beheerd' opgeven.
- CS8387: Type parameter 'type parameter' heeft dezelfde naam als de typeparameter uit de buitenste methode 'method'.
- CS8389: het weglaten van het typeargument is niet toegestaan in de huidige context.
- CS8427: Opsommingen, klassen en structuren kunnen niet worden gedeclareerd in een interface met een parameter van het type 'in' of 'out'.
- CS8665: Methode 'methode' geeft een 'klassebeperking' op voor typeparameter 'typeparameter', maar de bijbehorende typeparameter 'typeparameter' van de overschreven of expliciet geïmplementeerde methode 'method' is geen verwijzingstype.
- CS8666: Methode 'methode' specificeert een 'struct'-beperking voor de typeparameter 'typeparameter', maar de bijbehorende typeparameter 'typeparameter' van de overschreven of expliciet geïmplementeerde methode 'methode' is geen niet-nullbare waardetype.
- CS8822: Methode 'method' specificeert de beperking 'default' voor typeparameter 'type parameter', maar de bijbehorende typeparameter 'type parameter' van de overschreven of expliciet geïmplementeerde methode 'method' is beperkt tot een verwijzingstype of een waardetype.
- CS8823: De 'default'-beperking is alleen geldig voor overschrijvingsmethoden en methoden voor expliciete interface-implementatie.
- CS8893: 'type' is geen geldig type oproepconventie voor 'UnmanagedCallersOnly'.
- CS8894: Kan 'type' niet gebruiken als parameter of retourtype voor een methode die is toegeschreven aan UnmanagedCallersOnly.
- CS8895: Methoden die zijn toegeschreven aan 'UnmanagedCallersOnly' kunnen geen algemene typeparameters hebben en kunnen niet worden gedeclareerd in een algemeen type.
- CS8896: 'UnmanagedCallersOnly' kan alleen worden toegepast op gewone statische niet-abstracte, niet-virtuele methoden of statische lokale functies.
-
CS9011: Trefwoord
delegatekan niet worden gebruikt als een beperking. Bedoel jeSystem.Delegate? -
CS9012: Onverwacht trefwoord
record. Bedoelde jerecord structofrecord class? - CS9338: Inconsistente toegankelijkheid: type is minder toegankelijk dan klasse.
Typeparameterdeclaratie en naamgeving
- CS0080: Beperkingen zijn niet toegestaan voor niet-algemene declaraties.
- CS0081: Typeparameterdeclaratie moet een id zijn die geen type is.
- CS0412: Parameter: een parameter, lokale variabele of lokale functie mag niet dezelfde naam hebben als een parameter van het methodetype.
- CS0693: Type parameter 'type parameter' heeft dezelfde naam als de typeparameter van het buitenste type 'type'.
- CS0694: De parameter Type heeft dezelfde naam als het type of de methode die het bevat.
- CS0699: 'generic' definieert geen typeparameter 'id'.
- CS1948: De bereikvariabele 'name' mag niet dezelfde naam hebben als een parameter voor het methodetype.
- CS8387: Type parameter 'type parameter' heeft dezelfde naam als de typeparameter uit de buitenste methode 'method'.
-
CS9012: Onverwacht trefwoord
record. Bedoelde jerecord structofrecord class?
Deze fouten hebben betrekking op de manier waarop u parameters declareert en noemt in algemene typen en methoden. Typeparameternamen moeten geldige id's zijn, mogen niet conflicteren met andere id's binnen het bereik en moeten worden weergegeven in de lijst met parametertypen van de declaratie.
- Verwijder de beperkingscomponent uit niet-algemene declaraties (CS0080). De
wherecomponent kan alleen worden gebruikt voor algemene typen en methoden die typeparameters declareren. Als u beperkingen wilt toepassen, voegt u eerst typeparameters toe aan uw type- of methodedeclaratie. - Vervang de werkelijke typenamen door identificaties in typeparameterdeclaraties (CS0081). U moet typeparameters declareren met behulp van id's (zoals
T,TKeyofTValue) in plaats van betontypen (zoalsintofstring). Het doel van een typeparameter is om te fungeren als een tijdelijke aanduiding die de compiler vervangt door werkelijke typen wanneer het algemene type of de methode wordt gebruikt. - Wijzig de naam van typeparameters, lokale variabelen, parameters of bereikvariabelen om naamconflicten te voorkomen (CS0412, CS0694, CS1948). Typeparameternamen mogen geen id's in hetzelfde bereik overschaduwen en ze mogen niet overeenkomen met de naam van het omsluitende type of de omsluitende methode. LinQ-bereikvariabelen kunnen ook de parameternaam van een methodetype niet opnieuw gebruiken. Dergelijke conflicten zorgen voor dubbelzinnigheid over de id waarnaar wordt verwezen.
- Gebruik een andere naam voor typeparameters van interne typen die de buitenste verbergen (CS0693, CS8387). Wanneer een algemeen lid (zoals een methode of geneste type) zich in een algemene klasse of methode bevindt, is de binnenste typeparameter niet noodzakelijkerwijs hetzelfde als de buitenste. Als u ze dezelfde naam geeft, ontstaat verwarring over het type parameter waarnaar wordt verwezen. Gebruik een afzonderlijke naam voor de parameter van het binnenste type.
- Zorg ervoor dat alle typeparameters in beperkingsclausules worden gedeclareerd in de lijst met typeparameters (CS0699). Een
wherecomponent kan alleen verwijzen naar parameters van het type die worden weergegeven in de algemene declaratie. Als de naam in dewherecomponent niet overeenkomt met een gedeclareerde typeparameter, controleert u op typfouten of spelfouten. - Gebruik de juiste syntaxis voor recorddeclaratie (CS9012). Bij het declareren van een recordtype moet u een
record classofrecord struct(of alleenrecordvoor een verwijzingstype) gebruiken. Hetrecordtrefwoord alleen kan niet worden weergegeven in posities waarin de compiler een andere syntaxis voor declaratie verwacht.
Zie Algemene typeparameters en generics voor meer informatie.
Declaratie en volgorde van beperkingen
-
CS0401: De
new()beperking moet de laatste beperkende beperking zijn opgegeven. - CS0406: De beperking van het klassetype 'constraint' moet vóór eventuele andere beperkingen komen.
- CS0409: Er is al een beperkingscomponent opgegeven voor de typeparameter 'typeparameter'. Alle beperkingen voor een typeparameter moeten worden opgegeven in één where-component.
-
CS0449: De
classbeperkingen ,struct,unmanagedennotnulldefaultbeperkingen kunnen niet worden gecombineerd of gedupliceerd en moeten eerst worden opgegeven in de lijst met beperkingen. -
CS0450: Type parameter: kan niet zowel een beperkingsklasse als de
classofstructbeperking opgeven. -
CS0451: De
new()beperking kan niet worden gebruikt met destructbeperking. - CS8375: De beperking 'new()' kan niet worden gebruikt met de beperking Onbeheerd.
- CS8380: 'type': kan niet zowel een beperkingsklasse als de beperking 'niet-beheerd' opgeven.
-
CS9011: Trefwoord
delegatekan niet worden gebruikt als een beperking. Bedoel jeSystem.Delegate?
Beperkingen voor typeparameters moeten een specifieke volgorde volgen: primaire beperkingen (class, struct, unmanaged, notnullof default) komen eerst voor, vervolgens een beperking van het klassetype, gevolgd door interfacebeperkingen en ten slotte de new() constructorbeperking. Sommige beperkingen sluiten elkaar wederzijds uit en kunnen niet worden gecombineerd. Alle beperkingen voor één typeparameter moeten in één where component worden weergegeven.
- Plaats de
new()beperking aan het einde van de lijst met beperkingen (CS0401). Denew()beperking moet na alle andere beperkingen worden weergegeven. Wijzig bijvoorbeeldwhere T : new(), IDisposableinwhere T : IDisposable, new(). - Plaats de beperking van het klassetype vóór interfacebeperkingen (CS0406). Wanneer u een typeparameter beperkt tot een specifieke basisklasse, samen met interfaces, moet de klasse eerst worden weergegeven. Wijzig bijvoorbeeld
where T : IDisposable, MyBaseClassinwhere T : MyBaseClass, IDisposable. - Combineer alle beperkingen voor een typeparameter in één
wherecomponent (CS0409). U kunt niet meerderewherecomponenten gebruiken voor dezelfde typeparameter. Voeg ze samen in één clausule: wijzigwhere T : I where T : new()naarwhere T : I, new(). Meerderewhereclausules zijn alleen geldig wanneer ze betrekking hebben op verschillende typeparameters. - Plaats primaire beperkingen eerst en combineer geen wederzijds exclusieve beperkingen (CS0449). U kunt maximaal één van
class,struct,unmanagedofnotnull, ofdefault, opgeven en deze moet eerst worden weergegeven in de lijst met beperkingen. Declassenstructbeperkingen sluiten elkaar wederzijds uit, zoals enclassunmanaged. - Combineer geen specifieke klassebeperking met
class,structofunmanaged(CS0450, CS8380). Als een typeparameter is beperkt tot een specifiek klassetype, is dit impliciet een verwijzingstype dat in strijd is met destructofunmanagedbeperking. Verwijder de klassebeperking of de primaire beperking. - Combineer niet
new()metstructofunmanaged(CS0451, CS8375). Alle waardetypen hebben impliciet een openbare parameterloze constructor, dus denew()beperking is redundant wanneer deze wordt gecombineerd metstruct. Hetzelfde geldt voorunmanaged, wat impliceertstruct. Verwijder denew()beperking. - Vervang
delegatedoorSystem.Delegatein beperkingsclausules (CS9011). Hetdelegatetrefwoord wordt gebruikt voor het declareren van gedelegeerdentypen, niet als een beperking. Als u een typeparameter wilt beperken om typen te delegeren, gebruiktSystem.Delegateu deze als beperkingstype.
Zie Beperkingen voor typeparameters voor meer informatie.
Geldige beperkingstypen
- CS0405: Dubbele beperking voor typeparameter.
- CS0701: 'id' is geen geldige beperking. Een type dat als beperking wordt gebruikt, moet een interface, een niet-verzegelde klasse of een typeparameter zijn.
- CS0702: Beperking kan geen speciale klasse zijn.
- CS0703: Inconsistente toegankelijkheid: restrictietype is minder toegankelijk dan de declaratie.
- CS0706: Ongeldig beperkingstype. Een type dat als beperking wordt gebruikt, moet een interface, een niet-verzegelde klasse of een typeparameter zijn.
- CS0717: Statische klasse: statische klassen kunnen niet als beperkingen worden gebruikt.
- CS3024: Type beperking is niet CLS-compatibel.
Een beperking moet een interface, een niet-verzegelde klasse of een typeparameter zijn. Bepaalde typen zijn ongeldig als beperkingen vanwege hun speciale betekenis in het .NET-typesysteem of omdat ze niet kunnen worden overgenomen.
- Dubbele beperkingen verwijderen (CS0405). Elke beperking kan slechts eenmaal worden weergegeven in een beperkingscomponent. Als u
where T : I, Ihebt, verwijder het duplicaat. - Gebruik alleen niet-verzegelde typen als beperkingen (CS0701). Verzegelde klassen, structs en opsommingen kunnen niet worden overgenomen, dus ze dienen niet als beperkingen. Gebruik een interface die door de gewenste typen wordt geïmplementeerd of gebruik een niet-verzegelde basisklasse.
- Gebruik geen speciale klassen als beperkingen (CS0702). De typen Objecten ArrayValueType kunnen niet als beperkingen worden gebruikt. Elk type is al afgeleid van
Object, dus het beperken ervan biedt geen waarde.ArrayenValueTypeabstracte basistypen zijn die niet rechtstreeks kunnen worden overgenomen. Als u gedrag vergelijkbaar met een array nodig hebt, gebruikt u in plaats daarvanIList<T>ofIEnumerable<T>. - Zorg ervoor dat de beperkingstypen minstens zo toegankelijk zijn als het algemene type (CS0703). Een openbaar algemeen type kan geen beperkingen hebben met behulp van interne typen, omdat externe code geen geldige typeargumenten kan opgeven. Maak het beperkingstype openbaar of verminder de toegankelijkheid van het algemene type.
- Gebruik alleen interfaces, niet-verzegelde klassen of typeparameters als beperkingen (CS0706). U kunt geen matrices, verzegelde klassen, structs, opsommingen of andere ongeldige typen gebruiken als beperkingen. Overweeg een interface te gebruiken die de gewenste typen implementeren.
- Gebruik geen statische klassen als beperkingen (CS0717). Statische klassen kunnen niet worden uitgebreid omdat ze alleen statische leden bevatten. Er kan geen type worden afgeleid van een statische klasse, waardoor deze nutteloos is als beperking.
- Gebruik een CLS-compatibel type voor de typebeperking (CS3024). Wanneer een assembly is gemarkeerd met
[assembly: CLSCompliant(true)], kan het gebruik van een niet-CLS-compatibel type als beperking voor een generiek type ertoe leiden dat code die in sommige talen is geschreven, uw generieke klasse niet kan gebruiken.
Zie Beperkingen voor typeparameters voor meer informatie.
Tevredenstelling en transformaties van beperkingen
-
CS0311: Het type kan niet worden gebruikt als typeparameter
Tin het algemene type of de methode. Er is geen impliciete verwijzingsconversie van 'type1' naar 'type2'. - CS0312: Het type kan niet worden gebruikt als typeparameter in het algemene type of de methode. Het type null voldoet niet aan de beperking van 'constraint'.
- CS0313: Het type kan niet worden gebruikt als typeparameter in het algemene type of de methode. Het type null voldoet niet aan de beperking van 'constraint'. Null-typen kunnen niet voldoen aan interfacebeperkingen.
- CS0314: Het type kan niet worden gebruikt als typeparameter in het algemene type of de methode. Er is geen boksconversie of typeparameterconversie van 'type' naar 'constraint'.
-
CS0315: Het type kan niet worden gebruikt als typeparameter
Tin het algemene type of de methode. Er is geen boksconversie van 'type' naar 'beperking'. - CS0452: Het type 'typenaam' moet een verwijzingstype zijn om dit te kunnen gebruiken als parameter 'parameternaam' in het algemene type of de methode 'generic'.
- CS0453: Het type 'typenaam' moet een niet-null-waardetype zijn om dit te kunnen gebruiken als parameter 'parameternaam' in het algemene type of de methode 'generic'.
- CS8377: Het type 'type' moet een waardetype zijn dat geen null-waarde kan hebben, samen met alle velden op elk niveau van insluiting, om te worden gebruikt als parameter 'parameter' in het generieke type of de generieke methode 'generic'.
Deze fouten treden op wanneer een typeargument niet voldoet aan de beperkingen die zijn opgegeven voor een algemene typeparameter. Het typeargument moet de juiste conversies, overnamerelaties en structurele eigenschappen hebben om aan alle beperkingen te voldoen.
- Wijzig het typeargument in een argument met een impliciete verwijzingsconversie naar het beperkingstype (CS0311). Wanneer een typeparameter een beperking heeft zoals
where T : BaseType, moet elk typeargument omgezet kunnen worden naarBaseTypedoor een impliciete verwijzingsconversie of identiteitsconversie. Impliciete numerieke conversies (zoals vanshortnaarint) voldoen niet aan algemene parameterbeperkingen van het type. - Gebruik niet-null-waardetypen of wijzig het beperkingstype (CS0312, CS0313). Null-waardetypen (zoals
int?) verschillen van de onderliggende waardetypen en voldoen niet aan dezelfde beperkingen. Typen null-waarden kunnen niet voldoen aan interfacebeperkingen omdat de nullable wrapper zelf de interface niet implementeert. Gebruik de niet-null-vorm van het waardetype als het typeargument. - Herhaal de parameterbeperkingen van de basisklasse in eventuele declaraties van afgeleide klassen (CS0314). Wanneer een afgeleide algemene klasse overneemt van een beperkte basis generic-klasse, moet de afgeleide klasse dezelfde beperkingen voor de bijbehorende typeparameters declareren.
- Zorg ervoor dat typeargumenten voldoen aan referentietype- of klassebeperkingen (CS0315). Wanneer een typeparameter beperkt is tot een klassentype, kunt u geen waardetype (struct) gebruiken als typeargument, omdat er geen boxingconversie is die aan de beperkingsrelatie voldoet. Gebruik een verwijzingstype dat de beperking over neemt of implementeert.
- Gebruik een verwijzingstype als het typeargument wanneer de
classbeperking is opgegeven (CS0452). Waardetypen zoalsstructofintkunnen niet voldoen aan eenclassbeperking. Wijzig het typeargument in een verwijzingstype of verwijder declassbeperking als het algemene type kan werken met waardetypen. - Gebruik een niet-null-waardetype als het typeargument wanneer de
structbeperking is opgegeven (CS0453). Verwijzingstypen, null-waardetypen (int?) en andere niet-waardetypen kunnen niet voldoen aan eenstructbeperking. Gebruik een concreet, niet null-waardetype zoalsint,doubleof een door de gebruiker gedefinieerdestructwaarde . - Gebruik een type waarvan de velden alle niet-beheerde typen zijn wanneer de
unmanagedbeperking is opgegeven (CS8377). Deunmanaged-beperking vereist een waardetype dat geen null-waarde kan hebben, waarbij elk veld, op elk nestingsniveau, ook een niet-beheerd type is. Typen die velden met een referentietype of generieke typeparameters bevatten waarvan niet bekend is dat ze onbeheerd zijn, voldoen niet aan deze beperking.
Zie Beperkingen voor typeparameters voor meer informatie.
Conflicten met beperkingen en kringafhankelijkheden
- CS0454: Afhankelijkheid van kringbeperking met typeparameter 1 en typeparameter 2.
- CS0455: De parameter Type neemt conflicterende beperkingen 'constraint1' en 'constraint2' over.
- CS0456: Type parameter 'type parameter 1' heeft de beperking 'struct' zodat 'type parameter 1' niet kan worden gebruikt als een beperking voor 'type parameter 2'.
- CS8379: Type parameter 'type parameter 1' heeft de beperking 'unmanaged' zodat 'type parameter 1' niet kan worden gebruikt als een beperking voor 'type parameter 2'.
Beperkingen kunnen geen kringafhankelijkheden maken en typeparameters kunnen geen conflicterende beperkingen overnemen die niet tegelijkertijd kunnen worden voldaan. Beperkingen voor waardetypen (struct en unmanaged) worden impliciet verzegeld, zodat ze niet kunnen worden gebruikt als beperkingen voor andere typeparameters.
- Kringbeperkingsafhankelijkheden verwijderen (CS0454). Een typeparameter kan niet direct of indirect afhankelijk zijn van zichzelf door de beperkingen. Bijvoorbeeld,
where T : U where U : Tcreëert een cirkelafhankelijkheid. Verbreek de cyclus door een van de beperkingen te verwijderen. - Conflicterende overgenomen beperkingen (CS0455) verwijderen. Een typeparameter kan niet worden beperkt tot meerdere niet-gerelateerde klassen, omdat C# geen ondersteuning biedt voor meerdere klassenovername. Op dezelfde manier kan het niet worden beperkt tot zowel
structals een klassetype. Herstructureer uw typehiërarchie of verwijder een van de conflicterende beperkingen. - Gebruik geen met
structofunmanagedbeperkte typeparameter als beperking voor een andere typeparameter (CS0456, CS8379). Beperkingen voor waardetypen worden impliciet verzegeld, zodat er geen ander type hiervan kan worden afgeleid. Als u deze fout wilt oplossen, plaatst u het waardetype of de niet-beheerde beperking rechtstreeks op de tweede typeparameter in plaats van deze indirect te beperken via de eerste typeparameter.
Zie Beperkingen voor typeparameters voor meer informatie.
Regels voor overschrijf- en implementatiebeperkingen
- CS8665: Methode 'method' geeft een 'class'-beperking op voor typeparameter 'type parameter', maar de bijbehorende typeparameter 'type parameter' van de overschreven of expliciet geïmplementeerde methode 'method' is geen verwijzingstype.
- CS8666: Methode 'methode' geeft de beperking 'struct' op voor typeparameter 'typeparameter', maar de bijbehorende typeparameter 'typeparameter' van de overschreven of expliciet geïmplementeerde methode 'methode' is geen niet-nullbaar waardetype.
- CS8822: Methode 'method' specificeert de constraint 'default' voor de typeparameter 'type parameter', maar de overeenkomstige typeparameter 'type parameter' van de overschreven of expliciet geïmplementeerde methode 'method' is beperkt tot een referentietype of een waardetype.
- CS8823: De 'default'-beperking is alleen geldig voor overschrijvende methoden en methoden voor expliciete interface-implementatie.
Wanneer u een virtuele methode overschrijdt of expliciet een interfacemethode implementeert, moeten de beperkingen voor de typeparameters van de overschrijvende methode compatibel zijn met die van de basismethode. De beperking default is een speciale modifier die alleen wordt gebruikt in overridescenario's en scenario's met expliciete interface-implementatie om aan te geven dat een typeparameter noch een class- noch een struct-beperking heeft.
- Zorg ervoor dat de beperkingen van de overschrijvende methode overeenkomen met die van de basismethode (CS8665, CS8666). Een overschrijving kan de beperking
classniet toevoegen als de overeenkomstige typeparameter van de basismethode niet beperkt is tot een referentietype. Op dezelfde manier kan er geen beperking worden toegevoegdstructals de typeparameter van de basismethode niet is beperkt tot een waardetype. De override moet compatibel zijn met de basisdeclaratie. - Gebruik de
defaultbeperking alleen wanneer de typeparameter van de basismethode geen beperkingen heeft (CS8822). Dedefaultbeperking geeft aan dat de typeparameter geenclassofstructbeperking heeft. U kunt niet toepassendefaultals de overeenkomstige typeparameter van de overschreven methode al eenclassofstructbeperking heeft. - Gebruik de beperking
defaultalleen voor overschrijvingsmethoden of methoden voor expliciete interface-implementatie (CS8823). Dedefaultbeperking is niet geldig voor declaraties van reguliere methoden. Het bestaat specifiek om dubbelzinnigheid te voorkomen bij het overschrijven van een methode waarbij de basismethode een typeparameter zonder beperkingen had, en je moet aangeven dat de overschrijving die ook zonder beperkingen laat.
Zie Beperkingen voor typeparameters en de default beperking voor meer informatie.
Constructorbeperkingen
-
CS0304: Kan geen exemplaar van het variabeletype maken omdat deze niet de
new()beperking heeft. - CS0310: Het type moet een niet-abstract type zijn met een openbare parameterloze constructor om dit te kunnen gebruiken als parameter in het algemene type of de methode.
- CS0417: Identificator: kan geen argumenten opgeven bij het maken van een instantie van een variabele type.
Deze fouten hebben betrekking op de beperking new() en op het instantiëren van typeparameters met de operator new.
- Voeg de
new()beperking toe om parameters te typen die u moet instantiëren (CS0304). Wanneer u in een algemeen type of methode gebruiktnew T(), moet de compiler garanderen dat elk typeargument een parameterloze constructor heeft. Denew()beperking biedt deze garantie. - Zorg ervoor dat typeargumenten openbare parameterloze constructors (CS0310) hebben. Wanneer een typeparameter de
new()beperking heeft, moet elk betontype dat als een typeargument wordt gebruikt, niet-abstract zijn en een openbare parameterloze constructor opgeven. Typen met alleen persoonlijke, beveiligde of geparameteriseerde constructors kunnen niet voldoen aan denew()beperking. - Constructorargumenten verwijderen bij het instantiëren van typeparameters (CS0417). De
new()beperking garandeert alleen een parameterloze constructor. U kunt geen argumenten doorgeven aannew T(arguments). Als u exemplaren met specifieke argumenten wilt maken, kunt u overwegen om een fabriekspatroon of een interfacebeperking te gebruiken waarmee het bouwgedrag wordt gedefinieerd.
Zie Beperkingen voor typeparameters en de new() beperking voor meer informatie.
Aantal type argumenten en gebruik
- CS0224: Een methode met vararg kan niet algemeen zijn, zich in een algemeen type bevinden of een parameter params hebben.
- CS0305: Voor het gebruik van het algemene type zijn N-typeargumenten vereist.
- CS0306: Het type kan niet worden gebruikt als een typeargument.
- CS0307: De id kan niet worden gebruikt met typeargumenten.
- CS0308: Het niet-generieke type of methode kan niet worden gebruikt met typeargumenten.
- CS7002: Onverwacht gebruik van een algemene naam.
- CS8389: het weglaten van het typeargument is niet toegestaan in de huidige context.
Deze fouten hebben betrekking op het opgeven van het juiste aantal en het juiste type argumenten voor algemene typen en methoden.
- Verwijder algemene typeparameters of algemene typedeclaraties uit methoden die worden gebruikt
__arglist(CS0224). Het__arglisttrefwoord is niet compatibel met generics omdat de runtimemechanismen voor het verwerken van variabele argumenten conflicteren met het type vervangen dat vereist is voor algemene typeparameters. - Geef het exacte aantal typeargumenten op dat is opgegeven in de algemene declaratie (CS0305). Elke algemene typeparameter in de definitie moet een bijbehorend typeargument hebben wanneer het algemene type wordt geïnstantieerd.
- Gebruik alleen geldige typen als typeargumenten (CS0306). Aanwijzertypen (zoals
int*ofchar*) kunnen niet worden gebruikt als typeargumenten, omdat algemene typen beheerde typen vereisen die de garbagecollector kan volgen. - Verwijder de syntaxis van het typeargument uit niet-algemene constructies (CS0307, CS0308). Typeargumenten tussen punthaken kunnen alleen worden toegepast op algemene typen en methoden die typeparameters declareren. Zorg ervoor dat u de naamruimte hebt geïmporteerd die de algemene versie van het type bevat.
- Typeparameters verwijderen uit declaraties die geen ondersteuning bieden voor generics (CS7002). Sommige constructies, zoals opsommingen, kunnen niet algemeen zijn. Als u een algemene container voor enum-waarden nodig hebt, kunt u in plaats daarvan een algemene klasse of struct gebruiken.
- Geef alle vereiste typeargumenten expliciet op (CS8389). In sommige contexten, zoals het gebruik van de
typeofoperator of het maken van gedelegeerden, moet u alle typeargumenten opgeven en deze niet weglaten. Gebruik bijvoorbeeldtypeof(List<int>)in plaats van het typeargument weg te laten.
Zie Algemene typeparameters en generics voor meer informatie.
Afleiding van typeargumenten
- CS0411: De typeargumenten voor methode 'methode' kunnen niet worden afgeleid van het gebruik. Geef expliciet de typeargumenten op.
Deze fout treedt op wanneer u een algemene methode aanroept zonder expliciet de typeargumenten op te geven en de compiler niet kan afleiden welke typeargumenten u van plan bent. De compiler leidt de typeargumenten af uit de typen van de methodeargumenten die u bij de aanroep doorgeeft.
- Geef de typeargumenten expliciet op tussen punthaken (CS0411). Als de compiler de typeargumenten van de methodeargumenten niet kan bepalen, geeft u deze rechtstreeks op. Wijzig bijvoorbeeld
G()inG<int>(). Deze fout treedt meestal op wanneer een algemene methode geen parameters heeft waaruit het type moet worden afgeleid, of wanneer eennullargument wordt doorgegeven en de compiler het beoogde type niet kan bepalen.
Zie Algemene methoden voor meer informatie.
Variantie van parametertype
- CS1960: Ongeldige variantiemodificatie. Alleen typeparameters van interfaces en gedelegeerdetypen mogen als variant worden opgegeven.
- CS1961: Ongeldige variantie: de typeparameter moet covariant geldig zijn voor 'type'. 'typeparameter' is contravariant.
- CS8427: Opsommingen, klassen en structuren kunnen niet worden gedeclareerd in een interface met een parameter van het type 'in' of 'out'.
Variantieaanpassingen (in voor contravariantie, out voor covariantie) bepalen hoe u typeparameters kunt gebruiken in interface- en gedelegeerdendeclaraties. Alleen interfaces en delegates ondersteunen variantie. Een parameter van het type covariant (out) kan alleen worden weergegeven in uitvoerposities (retourtypen), terwijl een parameter van het type contravariant (in) alleen kan worden weergegeven in invoerposities (parametertypen).
- Gebruik variantieaanpassingen alleen op interface- en gemachtigde typeparameters (CS1960). Klassen, structs en andere typedeclaraties bieden geen ondersteuning voor variantieaanpassingen. Alleen declaraties van
interfaceendelegatekunneninofoutgebruiken voor hun typeparameters. - Gebruik
out(covariant) voor typeparameters die alleen worden weergegeven in retourtypen enin(contravariant) voor typeparameters die alleen worden weergegeven in parametertypen (CS1961). Als de typeparameter moet worden weergegeven in zowel invoer- als uitvoerposities, verwijdert u de variantieaanpassing. - Declareer geen opsommingen, klassen of structuren in een variantinterface (CS8427). Geneste typedeclaraties in een interface met
inofouttypeparameters zijn niet toegestaan omdat ze de variantieveiligheidsregels kunnen schenden. Verplaats het geneste type buiten de interfacedeclaratie.
Zie Covariantie en Contravariantie in Generics voor meer informatie.
Algemene gebruiksbeperkingen voor generieke typen
-
CS0403: Kan null niet converteren naar typeparameter omdat het een niet-null-waardetype kan zijn. Overweeg in plaats daarvan te gebruiken
default(T). -
CS0413: De typeparameter kan niet worden gebruikt met de
asoperator omdat deze geen klassetypebeperking of eenclassbeperking heeft. - CS0695: 'type' kan niet zowel 'interface1' als 'interface2' implementeren, omdat ze mogelijk worden samenvervangen voor bepaalde typeparametervervangingen.
- CS0698: Een algemeen type kan niet worden afgeleid van het type omdat het een kenmerkklasse is.
- CS0704: Kan geen opzoekactie voor niet-virtuele leden uitvoeren in 'type' omdat het een typeparameter is.
- CS0718: 'type': statische typen kunnen niet worden gebruikt als typeargumenten.
- CS1720: Expressie veroorzaakt altijd een System.NullReferenceException omdat de standaardwaarde van 'generic type' null is.
- CS1763: 'parameter' is van het type 'type'. Een standaardparameterwaarde van een ander verwijzingstype dan tekenreeks kan alleen worden geïnitialiseerd met null.
- CS8322: Kan argument met dynamisch type niet doorgeven aan algemene lokale functie met afgeleide typeargumenten.
- CS9338: Inconsistente toegankelijkheid: type is minder toegankelijk dan klasse.
Deze fouten hebben betrekking op beperkingen voor de manier waarop algemene typen en typeparameters kunnen worden gebruikt in expressies, overname en toegang tot leden.
- Vervang
nulltoewijzingen doordefault(T)of voeg eenclassbeperking toe (CS0403). Wanneer u een niet-getrainde typeparameter toewijstnull, kan de compiler niet garanderen dat het typeargument een verwijzingstype is. Gebruikdefault(T), dat de juiste standaardwaarde biedt voor elk type of voeg eenclassbeperking toe als u specifiek verwijzingstype-semantiek nodig hebt. - Voeg een
classof specifieke typebeperking toe wanneer u deasoperator (CS0413) gebruikt. Deasoperator retourneertnullals de conversie mislukt, maar waardetypen niet kunnen zijnnull. Voeg eenclassbeperking toe om ervoor te zorgen dat de typeparameter altijd een verwijzingstype is. - Vermijd het implementeren van dezelfde algemene interface meerdere keren met typeparameters die kunnen samenvoegen (CS0695). Wanneer een klasse meerdere keren een algemene interface implementeert met verschillende typeparameters (zoals
class G<T1, T2> : I<T1>, I<T2>), zou het maken van een instantie met hetzelfde type voor beide parameters een conflict veroorzaken. Implementeer de interface slechts eenmaal of herstructureer om een eenwording te voorkomen. - Algemene typeparameters verwijderen uit kenmerkklassen (CS0698). Deze fout wordt niet meer geproduceerd in de huidige versies van C#, omdat algemene kenmerken nu worden ondersteund.
- Gebruik het concrete beperkingstype in plaats van de typeparameter voor toegang tot geneste leden (CS0704). U hebt geen toegang tot geneste typen of niet-virtuele leden via een typeparameter. Gebruik in plaats van
T.InnerTypehet bekende beperkingstype rechtstreeks, zoalsBaseClass.InnerType. - Gebruik geen statische typen als typeargumenten (CS0718). Statische typen kunnen niet worden geïnstantieerd en kunnen niet worden gebruikt als algemene argumenten. Verwijder het statische type uit het algemene argument.
- Voorkom dat instantieleden worden aangeroepen op
default(T)wanneerTis beperkt tot een referentietype (CS1720). WanneerTde beperkingclassheeft, isdefault(T)null, dus het aanroepen van instantieleden ervoor leidt altijd tot een NullReferenceException. Voeg een null-controle toe voordat u leden aanroept of herstructureer de code om te voorkomen dat deze rechtstreeks wordt gebruiktdefault(T). - Gebruik
nullals de standaardparameterwaarde voor optionele parameters waarvan het type een verwijzingstype is (CS1763). Als een generieke methode een parameter van het typeTheeft enTeen referentietype is, vervangdefault(U)dan doornull, omdat standaardwaarden van optionele parameters compile-time-constanten moeten zijn endefault(T)nog steeds niet aan die vereiste voldoet. - Geef expliciet typeargumenten op bij het doorgeven van dynamische waarden aan algemene lokale functies (CS8322). Wanneer u een
dynamicargument doorgeeft aan een algemene lokale functie, kan de compiler geen argumenten van het type afleiden. Geef expliciet het typeargument op of cast de dynamische waarde. - Zorg ervoor dat typeargumenten die worden gebruikt in openbare of beveiligde handtekeningen minstens zo toegankelijk zijn als het lid (CS9338). Een openbaar algemeen lid moet typeargumenten gebruiken die openbaar toegankelijk zijn. Maak het typeargument openbaar of verminder de toegankelijkheid van het lid.
Zie Beperkingen voor typeparameters en standaardwaardeexpressies voor meer informatie.
UnmanagedCallersOnly Beperkingen
- CS8893: 'type' is geen geldig aanroepprotocoltype voor 'UnmanagedCallersOnly'.
- CS8894: Kan 'type' niet gebruiken als parameter of retourtype voor een methode die is toegeschreven aan UnmanagedCallersOnly.
- CS8895: Methoden die zijn toegeschreven aan 'UnmanagedCallersOnly' kunnen geen algemene typeparameters hebben en kunnen niet worden gedeclareerd in een algemeen type.
- CS8896: 'UnmanagedCallersOnly' kan alleen worden toegepast op gewone statische niet-abstracte, niet-virtuele methoden of statische lokale functies.
Het UnmanagedCallersOnlyAttribute kenmerk markeert methoden die niet-beheerde code kan aanroepen. Deze methoden hebben strikte vereisten omdat de runtime de overgang tussen beheerde en niet-beheerde aanroepconventies moet afhandelen.
- Gebruik alleen geldige typen aanroepconventies in het
UnmanagedCallersOnlykenmerk (CS8893). DeCallConvseigenschap van het kenmerk accepteert alleen herkende typen aanroepende conventies uit deSystem.Runtime.CompilerServicesnaamruimte. - Gebruik alleen blittable-typen als parameter en retourtypen (CS8894). Methoden die zijn gemarkeerd met
UnmanagedCallersOnly, kunnen geen beheerde typen (zoalsstringofobject) gebruiken als parameter- of retourtypen, omdat niet-beheerde aanroepers de door de garbagecollector beheerde verwijzingen niet kunnen verwerken. - Verwijder algemene typeparameters uit
UnmanagedCallersOnlymethoden en declareer ze niet in algemene typen (CS8895). Niet-beheerde aanroepconventies bieden geen ondersteuning voor generics, omdat de runtime de juiste oproepconventie voor algemene typevervangingen niet kan bepalen. - Alleen van toepassing op
UnmanagedCallersOnlygewone statische, niet-abstracte, niet-virtuele methoden of statische lokale functies (CS8896). Instantiemethoden, abstracte methoden en virtuele methoden kunnen niet worden gemarkeerd omdatUnmanagedCallersOnlyniet-beheerde bellers de verzendmechanismen waarvoor deze methoden zijn vereist, niet kunnen uitvoeren.
Zie UnmanagedCallersOnlyAttribute voor meer informatie.