Fouten en waarschuwingen met betrekking tot algemene typeparameters en algemene typeargumenten oplossen

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 T in 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 T in 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 as operator omdat deze geen klassetypebeperking of een class beperking heeft.
  • CS0417: Kenmerk: kan geen argumenten opgeven bij het instantiëren van een variabele-type.
  • CS0449: De classbeperkingen , struct, unmanageden notnulldefault beperkingen 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 class of struct beperking opgeven.
  • CS0451: De new() beperking kan niet worden gebruikt met de struct 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'.
  • 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 delegate kan niet worden gebruikt als een beperking. Bedoel je System.Delegate?
  • CS9012: Onverwacht trefwoord record. Bedoelde je record struct of record 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 je record struct of record 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 where component 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, TKeyof TValue) in plaats van betontypen (zoals int of string). 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 where component kan alleen verwijzen naar parameters van het type die worden weergegeven in de algemene declaratie. Als de naam in de where component 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 class of record struct (of alleen record voor een verwijzingstype) gebruiken. Het record trefwoord 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, unmanageden notnulldefault beperkingen 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 class of struct beperking opgeven.
  • CS0451: De new() beperking kan niet worden gebruikt met de struct beperking.
  • 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 delegate kan niet worden gebruikt als een beperking. Bedoel je System.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). De new() beperking moet na alle andere beperkingen worden weergegeven. Wijzig bijvoorbeeld where T : new(), IDisposable in where 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, MyBaseClass in where T : MyBaseClass, IDisposable.
  • Combineer alle beperkingen voor een typeparameter in één where component (CS0409). U kunt niet meerdere where componenten gebruiken voor dezelfde typeparameter. Voeg ze samen in één clausule: wijzig where T : I where T : new() naar where T : I, new(). Meerdere where clausules 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, unmanagedof notnull, of default, opgeven en deze moet eerst worden weergegeven in de lijst met beperkingen. De class en struct beperkingen sluiten elkaar wederzijds uit, zoals en classunmanaged .
  • Combineer geen specifieke klassebeperking met class, structof unmanaged (CS0450, CS8380). Als een typeparameter is beperkt tot een specifiek klassetype, is dit impliciet een verwijzingstype dat in strijd is met de struct of unmanaged beperking. Verwijder de klassebeperking of de primaire beperking.
  • Combineer niet new() met struct of unmanaged (CS0451, CS8375). Alle waardetypen hebben impliciet een openbare parameterloze constructor, dus de new() beperking is redundant wanneer deze wordt gecombineerd met struct. Hetzelfde geldt voor unmanaged, wat impliceert struct. Verwijder de new() beperking.
  • Vervang delegate door System.Delegate in beperkingsclausules (CS9011). Het delegate trefwoord wordt gebruikt voor het declareren van gedelegeerdentypen, niet als een beperking. Als u een typeparameter wilt beperken om typen te delegeren, gebruikt System.Delegate u 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, I hebt, 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. Array en ValueType abstracte basistypen zijn die niet rechtstreeks kunnen worden overgenomen. Als u gedrag vergelijkbaar met een array nodig hebt, gebruikt u in plaats daarvan IList<T> of IEnumerable<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 T in 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 T in 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 naar BaseType door een impliciete verwijzingsconversie of identiteitsconversie. Impliciete numerieke conversies (zoals van short naar int) 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 class beperking is opgegeven (CS0452). Waardetypen zoals struct of int kunnen niet voldoen aan een class beperking. Wijzig het typeargument in een verwijzingstype of verwijder de class beperking als het algemene type kan werken met waardetypen.
  • Gebruik een niet-null-waardetype als het typeargument wanneer de struct beperking is opgegeven (CS0453). Verwijzingstypen, null-waardetypen (int?) en andere niet-waardetypen kunnen niet voldoen aan een struct beperking. Gebruik een concreet, niet null-waardetype zoals int, doubleof een door de gebruiker gedefinieerde structwaarde .
  • Gebruik een type waarvan de velden alle niet-beheerde typen zijn wanneer de unmanaged beperking is opgegeven (CS8377). De unmanaged-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 : T creë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 struct als een klassetype. Herstructureer uw typehiërarchie of verwijder een van de conflicterende beperkingen.
  • Gebruik geen met struct of unmanaged beperkte 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 class niet toevoegen als de overeenkomstige typeparameter van de basismethode niet beperkt is tot een referentietype. Op dezelfde manier kan er geen beperking worden toegevoegd struct als de typeparameter van de basismethode niet is beperkt tot een waardetype. De override moet compatibel zijn met de basisdeclaratie.
  • Gebruik de default beperking alleen wanneer de typeparameter van de basismethode geen beperkingen heeft (CS8822). De default beperking geeft aan dat de typeparameter geen class of struct beperking heeft. U kunt niet toepassen default als de overeenkomstige typeparameter van de overschreven methode al een class of struct beperking heeft.
  • Gebruik de beperking default alleen voor overschrijvingsmethoden of methoden voor expliciete interface-implementatie (CS8823). De default beperking 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 gebruikt new T() , moet de compiler garanderen dat elk typeargument een parameterloze constructor heeft. De new() 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 de new() beperking.
  • Constructorargumenten verwijderen bij het instantiëren van typeparameters (CS0417). De new() beperking garandeert alleen een parameterloze constructor. U kunt geen argumenten doorgeven aan new 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 __arglist trefwoord 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* of char*) 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 typeof operator of het maken van gedelegeerden, moet u alle typeargumenten opgeven en deze niet weglaten. Gebruik bijvoorbeeld typeof(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() in G<int>(). Deze fout treedt meestal op wanneer een algemene methode geen parameters heeft waaruit het type moet worden afgeleid, of wanneer een null argument 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 interface en delegate kunnen in of out gebruiken voor hun typeparameters.
  • Gebruik out (covariant) voor typeparameters die alleen worden weergegeven in retourtypen en in (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 in of out typeparameters 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 as operator omdat deze geen klassetypebeperking of een class beperking 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 null toewijzingen door default(T) of voeg een class beperking toe (CS0403). Wanneer u een niet-getrainde typeparameter toewijst null , kan de compiler niet garanderen dat het typeargument een verwijzingstype is. Gebruik default(T), dat de juiste standaardwaarde biedt voor elk type of voeg een class beperking toe als u specifiek verwijzingstype-semantiek nodig hebt.
  • Voeg een class of specifieke typebeperking toe wanneer u de as operator (CS0413) gebruikt. De as operator retourneert null als de conversie mislukt, maar waardetypen niet kunnen zijn null. Voeg een class beperking 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, zoals BaseClass.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) wanneer T is beperkt tot een referentietype (CS1720). Wanneer T de beperking class heeft, is default(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 gebruikt default(T) .
  • Gebruik null als de standaardparameterwaarde voor optionele parameters waarvan het type een verwijzingstype is (CS1763). Als een generieke methode een parameter van het type T heeft en T een referentietype is, vervang default(U) dan door null, omdat standaardwaarden van optionele parameters compile-time-constanten moeten zijn en default(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 dynamic argument 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 UnmanagedCallersOnly kenmerk (CS8893). De CallConvs eigenschap van het kenmerk accepteert alleen herkende typen aanroepende conventies uit de System.Runtime.CompilerServices naamruimte.
  • Gebruik alleen blittable-typen als parameter en retourtypen (CS8894). Methoden die zijn gemarkeerd met UnmanagedCallersOnly, kunnen geen beheerde typen (zoals string of object) gebruiken als parameter- of retourtypen, omdat niet-beheerde aanroepers de door de garbagecollector beheerde verwijzingen niet kunnen verwerken.
  • Verwijder algemene typeparameters uit UnmanagedCallersOnly methoden 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 UnmanagedCallersOnly gewone statische, niet-abstracte, niet-virtuele methoden of statische lokale functies (CS8896). Instantiemethoden, abstracte methoden en virtuele methoden kunnen niet worden gemarkeerd omdat UnmanagedCallersOnly niet-beheerde bellers de verzendmechanismen waarvoor deze methoden zijn vereist, niet kunnen uitvoeren.

Zie UnmanagedCallersOnlyAttribute voor meer informatie.