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.
Verschillende fouten hebben betrekking op het declareren en gebruiken van lambda-expressies en anonieme methoden:
- CS0407: 'method' heeft het verkeerde retourtype.
- CS0428: Kan methodegroep 'Identifier' niet converteren naar niet-gedelegeerd type 'type'. Bedoelde u de methode aan te roepen?
- CS0748: Inconsistent lambda parametergebruik; parametertypen moeten allemaal expliciet of allemaal impliciet zijn.
- CS0815: Kan 'expressie' niet toewijzen aan een impliciet getypte variabele.
- CS0828: Kan 'expressie' niet toewijzen aan de eigenschap anoniem type.
- CS0837: De eerste operand van een 'is' of 'as'-operator is mogelijk geen lambda-expressie, anonieme methode of methodegroep.
- CS1065: Standaardwaarden zijn niet geldig in deze context.
- CS1621: De rendementsinstructie kan niet worden gebruikt binnen een anonieme methode of lambda-expressie.
-
CS1628: Kan
inrefofoutparameter niet gebruiken binnen een anonieme methode, lambda-expressie of query-expressie. - CS1632: De besturing kan het lichaam van een anonieme methode of lambda-expressie niet verlaten.
- CS1643: Niet alle codepaden retourneren een waarde in de anonieme methode van het type 'type'.
- CS1660: Kan lambda-expressie niet converteren naar type 'type' omdat het geen gemachtigdentype is.
- CS1661: Kan anonieme methodeblok niet converteren naar type 'type', omdat de parametertypen niet overeenkomen met de parametertypen van de gemachtigde.
- CS1662: Kan anoniem methodeblok niet converteren naar het beoogde gemachtigde type omdat sommige van de retourtypen in het blok niet impliciet kunnen worden geconverteerd naar het retourtype gedelegeerde.
- CS1673: Anonieme methoden, lambda-expressies en query-expressies in structs hebben geen toegang tot exemplaarleden van 'dit'.
- CS1676: Parameter 'number' moet worden gedeclareerd met het trefwoord 'trefwoord'.
- CS1677: Parameter 'number' mag niet worden gedeclareerd met het trefwoord 'trefwoord'.
- CS1678: Parameter 'number' wordt gedeclareerd als type 'type1', maar moet 'type2' zijn.
- CS1686: Lokale variabele of zijn leden kunnen hun adres niet verkrijgen en worden niet gebruikt binnen een anonieme methode of lambda-uitdrukking.
- CS1688: Kan het anonieme methodeblok niet converteren naar het gedelegeerde type 'delegate' omdat het geen parameterlijst heeft en een of meer out-parameters bevat.
- CS1706: Expressie kan geen anonieme methoden of lambda-expressies bevatten.
- CS1731: Kan expressie niet converteren naar gedelegeerde omdat sommige retourtypen in het blok niet impliciet converteerbaar zijn naar het gedelegeerde retourtype.
- CS1732: Verwachte parameter.
- CS1764: Kan geen vaste lokale gebruiken binnen een anonieme methode, lambda-expressie of query-expressie.
- CS8030: Anonieme functie geconverteerd naar een void-terugkerende gedelegeerde kan geen waarde retourneren.
- CS8175: Kan geen lokale verwijzing gebruiken binnen een anonieme methode, lambda-expressie of query-expressie.
- CS8820: Een statische anonieme functie kan geen verwijzing naar 'variabele' bevatten.
- CS8821: Een statische anonieme functie kan geen verwijzing naar 'this' of 'base' bevatten.
- CS8916: Kenmerken voor lambda-expressies vereisen een lijst met haakjes.
- CS8917: Het type gemachtigde kan niet worden afgeleid.
- CS8934: Kan anonieme methode niet converteren naar type 'type' omdat het retourtype niet overeenkomt met het retourtype gedelegeerde.
-
CS8975: Het contextuele trefwoord
varkan niet worden gebruikt als een expliciet lambda-retourtype. - CS9098: Impliciet getypt lambda parameter '...' kan geen standaardwaarde hebben.
Daarnaast hebben verschillende waarschuwingen betrekking op het declareren en gebruiken van lambda-expressies:
- CS0467: Dubbelzinnigheid tussen methode 'method' en non-method 'non-method'. Methodegroep gebruiken.
- CS1911: Toegang tot lid via een basiswoord van een anonieme methode, lambda-expressie, query-expressie of iterator resulteert in niet-verifieerbare code.
- CS8971: InterpolatedStringHandlerArgument heeft geen effect wanneer deze wordt toegepast op lambda-parameters en wordt genegeerd op de oproepsite.
- CS8974: Methodegroep 'methode' converteren naar type 'type' dat geen delegaat is. Bedoelde u de methode aan te roepen?
- CS9099: De standaardparameterwaarde komt niet overeen met het type doeldelegatie.
- CS9100: Parameter heeft params modifier in lambda, maar niet in doel gedelegeerde type.
De compiler produceert ook het volgende informatieve bericht:
- CS9236: Compiling vereist dat de lambda-expressie ten minste aantal keren wordt gebonden. Overweeg om de lambda-expressie te declareren met expliciete parametertypen, of als de aanroep van de methode algemeen is, overweeg dan expliciete typeargumenten te gebruiken.
Syntaxisbeperkingen in lambda-expressies
-
CS0837: De eerste operand van een
isofasoperator is mogelijk geen lambda-expressie, anonieme methode of methodegroep. -
CS1621: De
yieldinstructie kan niet worden gebruikt binnen een anonieme methode of lambda-expressie. -
CS1628: Kan
in,refofoutparameter niet binnen een anonieme methode, lambda-expressie of query-expressie gebruiken. - CS1632: Controle kan het lichaam van een anonieme methode of lambda-expressie niet verlaten.
-
CS1673: Anonieme methoden, lambda-expressies en query-expressies in structs hebben geen toegang tot exemplaarleden van
this. - CS1686: Het adres van een lokale variabele of zijn leden kan niet worden genomen en gebruikt binnen een anonieme methode of lambda-expressie.
- CS1706: Expressie kan geen anonieme methoden of lambda-expressies bevatten.
- CS1764: Kan geen vaste lokale gebruiken binnen een anonieme methode, lambda-expressie of query-expressie.
- CS1911: Waarschuwing: Toegang tot lid via een basiswoord van een anonieme methode, lambda-expressie, query-expressie of iterator resulteert in onvertrouwbare code.
- CS8175: Kan geen lokale verwijzing gebruiken binnen een anonieme methode, lambda-expressie of query-expressie.
- CS8820: Een statische anonieme functie kan geen verwijzing naar 'variabele' bevatten.
- CS8821: Een statische anonieme functie kan geen verwijzing naar 'this' of 'base' bevatten.
- CS8971: Waarschuwing: InterpolatedStringHandlerArgument heeft geen effect wanneer deze wordt toegepast op lambda-parameters en wordt genegeerd op de oproepsite.
- CS9236: Informatief: Compileren vereist het binden van de lambda-expressie ten minste aantal keren. Overweeg om de lambda-expressie te declareren met expliciete parametertypen, of als de aanroep van de methode algemeen is, overweeg dan expliciete typeargumenten te gebruiken.
De compiler verbiedt bepaalde C#-constructies binnen lambda-expressies en anonieme methoden. Deze beperkingen bestaan omdat de compiler lambdas en anonieme methoden transformeert in gemachtigde aanroepen of expressiestructuren, en sommige constructies kunnen niet worden weergegeven in deze formulieren. Zie de sectie anonieme functie-expressies van de C#-specificatie voor meer informatie.
U kunt deze fouten corrigeren met behulp van de volgende richtlijnen:
- Verplaats een
yield returnofyield breakinstructie uit het lambda-lichaam en zet deze in de omringende iteratormethode, of converteer de lambda naar een lokale functie, dieyieldinstructies ondersteunt (CS1621). - Vermijd te verwijzen naar
in,refofout-parameters van de insluitende methode in het lambda-hoofdletter. Wanneer de lambda deze parameters vastlegt als onderdeel van een sluiting, kunnen de referentiesemantiek vanref-like-parameters niet worden bewaard. Kopieer de waarde naar een lokale variabele en gebruik die lokale variabele of converteer de lambda naar een lokale functie (CS1628). - Verwijder elke
break,goto, ofcontinueinstructie die de controle buiten de lambda-body overbrengt. Controle-instructies moeten verwijzen naar labels of lussen binnen hetzelfde lambda-lichaam (CS1632). - Vermijd in een
structtype om binnen een lambda-expressie, anonieme methode of query-expressie naar instantieleden te verwijzen viathis. Omdat de compiler vastlegtthisop waarde in eenstruct, hebben mutaties in de lambda geen invloed op het oorspronkelijke exemplaar. Pak de benodigde lidwaarden uit in lokale variabelen vóór de lambda of converteer naar een lokale functie, die rechtstreeks toegangthisheeft (CS1673). - Neem niet het adres van een lokale variabele die ook door de lambda wordt vastgelegd. De compiler verplaatst vastgelegde variabelen naar een heap-toegewezen sluitingsobject, waardoor het adres instabiel wordt. Scheid de logica voor adresgebruik van de lambda of gebruik in plaats daarvan een lokale functie (CS1686).
- Verplaats de lambda-expressie of anonieme methode uit de omvattende expressie die deze verbiedt. Sommige expressies, zoals kenmerkconstructors, bieden geen ondersteuning voor lambda-expressies of anonieme methoden als argumenten (CS1706).
- Gebruik geen
fixedlokale variabele in een lambda-body. De vastpin garantie van defixedinstructie is alleen van toepassing op het omsluitende bereik, niet op de closure die de compiler genereert (CS1764). - Gebruik geen
reflokale binnenkant van een lambda-lichaam. Net alsrefparameters kunnenreflokale variabelen niet worden vastgelegd in de closure die de compiler genereert voor de lambda. Wijs de waarde toe aan een niet-lokalerefvariabele of converteer de lambda naar een lokale functie (CS8175). - Gebruik geen lambda-expressie, anonieme methode of methodegroep als de eerste operand van de
isofasoperator. Deze constructies hebben geen type dat tijdens runtime kan worden getest. Wijs eerst de expressie toe aan een variabele en test vervolgens de variabele (CS0837). - Verwijder de
staticwijzigingsfunctie uit de lambda of verwijder de verwijzing naar de vastgelegde variabele. Eenstaticlambda verbiedt het capturen van lokale variabelen, parameters, ofthisom onbedoelde closure-allocaties te voorkomen. Als u naar buitenste variabelen wilt verwijzen, verwijdert u destaticwijzigingsfunctie. Als u heaptoewijzing minimaal wilt houden, geeft u de waarden door als parameters aan de lambda (CS8820, CS8821). - Verwijder de InterpolatedStringHandlerArgumentAttribute parameter lambda of verplaats de logica naar een methode waar het kenmerk wordt gehonoreerd. De compiler negeert dit kenmerk voor lambda-parameters omdat lambda-aanroepen niet dezelfde verlaging met een geïnterpoleerde tekenreekshandler gebruiken als reguliere methode-aanroepen (CS8971).
- Vermijd het aanroepen van een virtueel lid via het
basetrefwoord in een lambda- of anonieme methode. De compiler genereert een niet-virtuele aanroep via een helpermethode, die niet-verifieerbare code produceert. Overweeg debaseaanroep uit te pakken in een afzonderlijke methode en die methode aan te roepen vanuit de lambda (CS1911). - Verminder de complexiteit van overbelaste methode-aanroepen die lambda-expressies accepteren of voeg expliciete typegegevens toe. Wanneer de compiler meerdere keren een lambda-expressie moet binden om overbelastingen op te lossen, wordt deze diagnostische gegevens verzonden. Als u de lambda declareert met expliciete parametertypen of expliciete typeargumenten opgeeft voor de algemene methodeaanroep, vermindert u het aantal bindingen dat de compiler moet uitvoeren (CS9236).
Lambda-expressieparameters en -retourwaarden
- CS0748: Inconsistent lambda parametergebruik; parametertypen moeten allemaal expliciet of allemaal impliciet zijn.
- CS1065: Standaardwaarden zijn niet geldig in deze context.
- CS1643: Niet alle codepaden retourneren een waarde in de anonieme methode van het type 'type'.
- CS1661: Kan anonieme methodeblok niet converteren naar type 'type', omdat de parametertypen niet overeenkomen met de parametertypen van de gemachtigde.
- CS1662: Kan anonieme methodeblok niet converteren naar het beoogde gedelegeerde type omdat sommige van de retourtypen in het blok niet impliciet kunnen worden geconverteerd naar het gedelegeerde retourtype.
- CS1676: Parameter 'number' moet worden gedeclareerd met het trefwoord 'trefwoord'.
- CS1677: Parameter 'number' mag niet worden gedeclareerd met het trefwoord 'trefwoord'.
- CS1678: Parameter 'number' wordt gedeclareerd als type 'type1', maar moet 'type2' zijn.
- CS1688: Kan anoniem methodeblok niet converteren zonder een parameterlijst om het type gedelegeerde te delegeren omdat het een of meer out-parameters heeft.
- CS1731: Kan expressie niet converteren naar gedelegeerde omdat sommige retourtypen in het blok niet impliciet kunnen worden geconverteerd naar het gedelegeerde retourtype.
- CS1732: Verwachte parameter.
- CS8030: Anonieme functie geconverteerd naar een delegate die geen waarde retourneert kan geen waarde retourneren.
- CS8916: Kenmerken voor lambda-expressies vereisen een lijst met haakjes.
- CS8934: Kan anonieme methode niet converteren naar type 'type' omdat het retourtype niet overeenkomt met het retourtype gedelegeerde.
- CS8975: Het contextuele trefwoord var kan niet worden gebruikt als een expliciet lambda-retourtype.
- CS9098: Impliciet getypt lambda parameter '...' kan geen standaardwaarde hebben.
Deze fouten geven een probleem aan met een lambda-expressieparameter of retourtypedeclaratie. Zie lambda-expressies, anonieme methoden en de sectie met anonieme functie-expressies van de C#-specificatie voor de volledige regels voor lambdaparameter en retourtypen.
Opmerking
CS1731 en CS1732 worden niet meer geproduceerd door de huidige versie van de C#-compiler (Roslyn). Deze kunnen worden weergegeven als u een oudere compilerversie gebruikt.
U kunt deze fouten corrigeren met behulp van de volgende richtlijnen:
- Zorg ervoor dat alle parameters in een lambda-expressie dezelfde typestijl gebruiken. Wanneer een lambda meerdere parameters heeft, moet elke parameter expliciet of impliciet worden getypt . U kunt de twee stijlen niet combineren in dezelfde parameterlijst (CS0748).
- Voeg expliciete typen toe aan een lambda-parameter met een standaardwaarde. De compiler vereist expliciete typen voor parameters met standaardwaarden, omdat er een aangepast gemachtigdentype moet worden gegenereerd waarmee de standaardwaarde wordt gecodeerd. Impliciet getypte parameters bieden niet voldoende informatie voor de compiler om dat gedelegeerde type te maken (CS1065, CS9098).
- Verwijder standaardparameterwaarden uit anonieme methoden die zijn gedeclareerd met behulp van de
delegateoperator. Standaardparameterwaarden worden alleen ondersteund in lambda-expressies, niet in anonieme methoden. Converteer de anonieme methode naar een lambda-expressie als u standaardwaarden (CS1065) nodig hebt. - Koppel de parametertypen,
ref/out/inmodifiers en het aantal parameters van de lambda of anonieme methode aan het type doeldelegatie. De compiler voert een exacte overeenkomst van parameterhandtekeningen uit bij het converteren van een anonieme functie naar een gemachtigde: elke parameter moet het juiste type hebben, en elkeref,outofinwijzigingsfunctie moet exact aanwezig zijn wanneer de gedelegeerde deze verwacht (CS1661, CS1676, CS1677, CS1678). - Voeg een parameterlijst toe aan de anonieme methode wanneer het type doeldelegatie parameters heeft
out. Een anonieme methode die is gedeclareerd zonder een parameterlijst (met behulp van `delegate { }` syntaxis) kan met de meeste gedelegeerden overeenkomen, maar de compiler kan de vereiste `out` parameters niet impliciet synthetiseren. Declareer de parameters expliciet zodat deze overeenkomen met de handtekening voor gemachtigden (CS1688). - Zorg ervoor dat alle codepaden in de lambda- of anonieme methode een waarde retourneren wanneer het type doeldelegatie een niet-ongeldig retourtype heeft. Elke tak in de code moet een retourwaarde produceren die impliciet kan worden omgezet in het retourtype van de delegate (CS1643, CS1662, CS1731, CS8934).
- Verwijder een
return-instructie met een waarde uit een lambda- of anonieme methode die is toegewezen aan een afgevaardigde van eenvoid-type dat een waarde retourneert, zoalsAction. Omdat het retourtype van de delegeerdervoidis, kan de code in het functieblok geen waarde retourneren (CS8030). - Plaats de lijst met parameters tussen haakjes wanneer kenmerken worden toegepast op een lambdaparameter. De compiler heeft de geparentheseerde vorm nodig om de syntaxis van attributen te onderscheiden van andere uitdrukkingen. Schrijf bijvoorbeeld
([MyAttribute] int x) => xin plaats van[MyAttribute] x => x(CS8916). - Gebruik een specifieke typenaam in plaats van
varhet expliciete retourtype van een lambda-expressie. Het trefwoordvaris gereserveerd voor impliciet getypte lokale variabelen en kan niet worden gebruikt als een lambda-retourtypeaantekening. Geef het werkelijke retourtype op of laat het retourtype weg en laat de compiler dit afleiden (CS8975). - Herstel de parameterlijst zodat de compiler deze kan herkennen als een geldige parameterdeclaratie. Deze fout geeft een onjuiste parameterlijst aan waarbij de compiler een parameter-id verwachtte, maar iets anders heeft gevonden (CS1732).
Gedelegeerde type Lambda-expressie
- CS0407: 'method' heeft het verkeerde retourtype.
- CS0428: Kan methodegroep 'Identifier' niet converteren naar niet-delegate type 'type'. Bedoelde u de methode aan te roepen?
- CS0467: Waarschuwing: Dubbelzinnigheid tussen methode 'method' en non-method 'non-method'. Methodegroep gebruiken.
- CS0815: Kan 'expressie' niet toewijzen aan een impliciet getypte variabele.
- CS0828: Kan 'expressie' niet toewijzen aan de eigenschap anoniem type.
- CS1660: Kan lambda-expressie niet converteren naar type 'type' omdat het geen gemachtigdentype is.
- CS8917: Het type gemachtigde kan niet worden afgeleid.
- CS8974: Waarschuwing: methodegroep 'methode' converteren naar niet-gemachtigdentype 'type'. Bent u van plan de methode aan te roepen?
- CS9099: Waarschuwing: de standaardparameterwaarde komt niet overeen met het type doeldelegatie.
- CS9100: Waarschuwing: parameter heeft params modifier in lambda, maar niet in het doeldelegeringstype.
Deze fouten geven een probleem aan met het gemachtigde type dat door de compiler wordt afgeleid of verwacht voor een lambda-expressie, anonieme methode of methodegroep. Zie lambda-expressies, anonieme methoden en de sectie met anonieme functie-expressies van de C#-specificatie voor de volledige regels voor conversies van gemachtigden.
Opmerking
De huidige versie van de C#-compiler (Roslyn) produceert geen CS0467. Deze fout kan optreden als u een oudere compilerversie gebruikt.
U kunt deze fouten corrigeren met behulp van de volgende richtlijnen:
- Zorg ervoor dat het doeltype van de toewijzing of conversie een delegate-type is of System.Linq.Expressions.Expression. Een lambda-expressie of anonieme methode kan niet worden toegewezen aan een niet-gemachtigd type, zoals
objectof een interface. Wijzig het type van de variabele in een compatibel gemachtigdetype zoalsFunc<>ofAction<>, of gebruikvardeze om de compiler het gedelegeerdetype (CS1660) te laten afleiden. - Geef voldoende context op voor de compiler om één gemachtigdentype voor de lambda-expressie te bepalen. Wanneer
varis toegewezen, heeft de compiler een ondubbelzinnig retourtype en een parameterlijst nodig. Wanneer deze is toegewezen aan een eigenschap van een anoniem type, kan de compiler helemaal geen gedelegeerde type afleiden. Wijs de lambda toe aan een variabele met een expliciet gemachtigdentype en gebruik die variabele vervolgens in de initialisatiefunctie voor anonieme typen (CS0815, CS0828, CS8917). - Koppel het retourtype van de methodegroep aan het gedeclareerde retourtype van de gemachtigde. Voor een conversie van een methodegroep moet het retourtype van de methode identiteits-converteerbaar of impliciet converteerbaar zijn naar het retourtype van de gemachtigde. Wijzig het retourtype van de methode of wijzig het type gemachtigde dat overeenkomt met (CS0407).
- Roep de methode aan in plaats van de methodegroep toe te wijzen wanneer het doeltype geen gemachtigde is. Als het doeltype ,
stringof een ander type niet-gemachtigde isint, hebt u waarschijnlijk de methode aangeroepen en het resultaat ervan toegewezen. Voeg haakjes en argumenten toe om de methode aan te roepen (CS0428, CS8974). - Los dubbelzinnigheid op tussen een methode en een niet-methodelid dat dezelfde naam heeft. Wijzig de naam van een van de conflicterende leden of gebruik een volledig gekwalificeerde verwijzing om de dubbelzinnigheid (CS0467) te verwijderen.
- Verwijder de standaardparameterwaarde of
paramswijzigingsfunctie uit de lambda wanneer het type doeldelegatie een standaardFunc<>ofAction<>type is. Standaardwaarden enparamsmodifiers zorgen ervoor dat de compiler een aangepast type gedelegeerde genereert dat niet overeenkomtFunc<>ofAction<>. Gebruikvarom de compiler het juiste gedelegeerdentype te laten synthetiseren of verwijder de standaardwaarde ofparamsmodifier zodat de lambda overeenkomt met het gedeclareerde gedelegeerdentype (CS9099, CS9100).