Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Számos hiba a lambdakifejezések és a névtelen metódusok deklarálásával és használatával kapcsolatos:
- CS0407: A "metódus" helytelen visszatérési típussal rendelkezik.
- CS0428: Az "Azonosító" metóduscsoport nem delegált típussá nem konvertálható. Meg akarta hívni a metódust?
- CS0748: Inkonzisztens lambda paraméterhasználat; a paramétertípusoknak explicitnek vagy minden implicitnek kell lenniük.
- CS0815: A "kifejezés" nem rendelhető implicit típusú változóhoz.
- CS0828: A "kifejezés" nem rendelhető névtelen típustulajdonsághoz.
- CS0837: Az "is" vagy "as" operátor első operandusa nem lehet lambda kifejezés, névtelen metódus vagy metóduscsoport.
- CS1065: Az alapértelmezett értékek ebben a környezetben nem érvényesek.
- CS1621: A hozamkimutatás nem használható névtelen metódusban vagy lambdakifejezésben.
-
CS1628: Névtelen metódusban, lambdakifejezésben vagy lekérdezési kifejezésben nem használható
inrefvagyoutparaméter. - CS1632: A vezérlőelem nem hagyhatja el egy névtelen metódus vagy lambdakifejezés törzsét.
- CS1643: Nem minden kódútvonal ad vissza "típus" típusú névtelen metódusban lévő értéket.
- CS1660: A lambda kifejezés nem konvertálható "típus" típussá, mert nem delegált típus.
- CS1661: A névtelen metódusblokk nem konvertálható típussá, mert a paramétertípusok nem felelnek meg a delegált paramétertípusoknak.
- CS1662: A névtelen metódusblokk nem konvertálható a kívánt delegált típussá, mert a blokk egyes visszatérési típusai nem konvertálhatók implicit módon a delegált visszatérési típussá.
- CS1673: Névtelen metódusok, lambdakifejezések és lekérdezési kifejezések a szerkezeteken belül nem férnek hozzá az "e" példány tagjaihoz.
- CS1676: A "number" paramétert a "kulcsszó" kulcsszóval kell deklarálni.
- CS1677: A "number" paraméter nem deklarálható a "kulcsszó" kulcsszóval.
- CS1678: A "number" paraméter "type1" típusként van deklarálva, de "type2" legyen.
- CS1686: A helyi változó vagy tagjai nem vehetik fel a címüket, és nem használhatók névtelen metódusban vagy lambdakifejezésben.
- CS1688: A paraméterlista nélküli névtelen metódusblokk nem konvertálható delegált típusú delegálásra, mert egy vagy több kimenő paraméterrel rendelkezik.
- CS1706: A kifejezés nem tartalmazhat névtelen metódusokat vagy lambdakifejezéseket.
- CS1731: A kifejezés nem konvertálható delegálttá, mert a blokk egyes visszatérési típusai nem konvertálhatók implicit módon a delegált visszatérési típussá.
- CS1732: Várt paraméter.
- CS1764: Nem használható rögzített helyi beállítás névtelen metóduson, lambdakifejezésen vagy lekérdezési kifejezésen belül.
- CS8030: Érvénytelensé konvertált névtelen függvény nem tud értéket visszaadni.
- CS8175: Névtelen metóduson, lambdakifejezésen vagy lekérdezési kifejezésen belül nem használható a ref local.
- CS8820: A statikus névtelen függvények nem tartalmazhatnak "változóra" mutató hivatkozást.
- CS8821: A statikus névtelen függvények nem tartalmazhatnak "erre" vagy "alapra" mutató hivatkozást.
- CS8916: A lambda kifejezések attribútumai zárójeles paraméterlistát igényelnek.
- CS8917: A meghatalmazott típusa nem vonható le.
- CS8934: A névtelen metódus nem konvertálható típussá, mert a visszatérési típus nem egyezik a meghatalmazott visszatérési típusával.
-
CS8975: A környezetfüggő kulcsszó
varnem használható explicit lambda visszatérési típusként. - CS9098: Implicit módon beírt lambda paraméter : "..." Nem lehet alapértelmezett érték.
Emellett számos figyelmeztetés vonatkozik a lambdakifejezések deklarálására és használatára:
- CS0467: Kétértelműség a metódus és a "nem metódus" metódus között. Metóduscsoport használata.
- CS1911: A taghoz való hozzáférés egy "alap" kulcsszón keresztül névtelen metódusból, lambdakifejezésből, lekérdezési kifejezésből vagy iterátorból, ellenőrizhetetlen kódot eredményez.
- CS8971: Az InterpolatedStringHandlerArgument nincs hatással a lambda paramétereire, és a hívás helyszínén figyelmen kívül hagyja.
- CS8974: A metóduscsoport 'metódus' nem delegált típussá történő konvertálása. Meg akarta hívni a metódust?
- CS9099: Az alapértelmezett paraméter értéke nem egyezik a céldelegált típusával.
- CS9100: A paraméternek van 'params' módosítója a lambda kifejezésben, de a cél delegált típusban nincs.
A fordító a következő tájékoztató üzenetet is létrehozza:
- CS9236: A fordításhoz legalább a lambda kifejezés kötésére van szükség. Fontolja meg a lambda kifejezés explicit paramétertípusokkal való deklarálását, vagy ha a metódushívás általános, fontolja meg explicit típusú argumentumok használatát.
Szintaxiskorlátozások a Lambda-kifejezésekben
-
CS0837: Egy vagy
istöbbasoperátor első operandusa nem lehet lambda kifejezés, névtelen metódus vagy metóduscsoport. -
CS1621: Az
yieldutasítás nem használható névtelen metódusban vagy lambdakifejezésben. -
CS1628: Anonim metódus, lambdakifejezés vagy lekérdezési kifejezés esetén a
in,refvagyoutparaméter nem használható. - CS1632: A vezérlőelem nem hagyhatja el egy névtelen metódus vagy lambdakifejezés törzsét.
-
CS1673: Névtelen metódusok, lambdakifejezések és lekérdezési kifejezések a szerkezeteken belül nem férnek hozzá a példányok tagjaihoz
this. - CS1686: Helyi változó vagy annak tagjai nem kaphatnak címet, és nem használhatók névtelen metódusban vagy lambdakifejezésben.
- CS1706: A kifejezés nem tartalmazhat névtelen metódusokat vagy lambdakifejezéseket.
- CS1764: Nem használható rögzített lokális változó névtelen metódusban, lambdakifejezésben vagy lekérdezési kifejezésben.
- CS1911: Figyelmeztetés: A taghoz való hozzáférés egy "alap" kulcsszón keresztül névtelen metódusból, lambdakifejezésből, lekérdezési kifejezésből vagy iterátorból nem ellenőrizhető kódot eredményez.
- CS8175: Névtelen metóduson, lambdakifejezésen vagy lekérdezési kifejezésen belül nem használható a ref local.
- CS8820: A statikus névtelen függvények nem tartalmazhatnak "változóra" mutató hivatkozást.
- CS8821: A statikus névtelen függvények nem tartalmazhatnak "erre" vagy "alapra" mutató hivatkozást.
- CS8971: Figyelmeztetés: Az InterpolatedStringHandlerArgument nincs hatással a lambda paraméterekre való alkalmazáskor, és a hívás helyszínén figyelmen kívül hagyja.
- CS9236: Információ: A fordításhoz legalább ennyiszer kell kötni a lambda kifejezést. Fontolja meg a lambda kifejezés explicit paramétertípusokkal való deklarálását, vagy ha a hívott metódus generikus, fontolja meg explicit típusú argumentumok használatát.
A fordító tilt bizonyos C#-szerkezeteket a lambdakifejezéseken és a névtelen metódusokon belül. Ezek a korlátozások azért léteznek, mert a fordító delegált meghívásokká vagy kifejezésfákká alakítja a lambdákat és a névtelen metódusokat, és egyes szerkezetek nem jeleníthetők meg ezekben az űrlapokban. További információt a C# specifikáció névtelen függvénykifejezések szakaszában talál.
Ezeket a hibákat az alábbi útmutatóval háríthatja el:
- A lambda törzséből és a hozzá tartozó
yield returnáthelyezhet egy tetszőlegesyield breakvagy utasítást, vagy átalakíthatja a lambdát egy helyi függvénysé, amely támogatjayieldaz utasításokat (CS1621). - Kerülje a lambda törzsében található beágyazási módszer hivatkozásait vagy
inparamétereit.refoutHa a lambda lezárás részeként rögzíti ezeket a paramétereket, az olyan paraméterek referencia-szemantikája, mint amilyen aref, nem tartható fenn. Másolja az értéket egy helyi változóba, és használja helyette ezt a helyi értéket, vagy alakítsa át a lambdát helyi függvénysé (CS1628). - Távolítsa el a lambda törzséből azokat az utasításokat, mint a
break,gotovagycontinue, amelyek irányítást adnak át. A vezérlőfolyamat-utasításoknak azonos lambdatörzsben (CS1632) kell célcímkéket vagy hurkokat célként használniuk. -
structEgy típus esetében kerülje a példánytagokra való hivatkozásokat lambdakifejezésen, névtelen metóduson vagy lekérdezési kifejezésen keresztülthis. Mivel a fordító érték szerint rögzítithisastructlambdán belüli mutációkat, nem befolyásolja az eredeti példányt. Bontsa ki a szükséges tagértékeket helyi változókba a lambda előtt, vagy alakítsa át helyi függvénysé, amely közvetlenül elérhetőthis(CS1673). - Ne vegye fel a címét annak a helyi változónak, amelyet a lambda is rögzít. A fordító áthelyezi a rögzített változókat egy halom által lefoglalt lezáró objektumba, így a címük instabillá válik. Válassza el a címfelvételi logikát a lambdától, vagy használjon helyette egy helyi függvényt (CS1686).
- Helyezze ki a lambda kifejezést vagy a névtelen metódust a tiltó kifejezést tartalmazó kifejezésből. Egyes kifejezések, például az attribútumkonstruktorok, nem támogatják a lambdakifejezéseket vagy a névtelen metódusokat argumentumként (CS1706).
- Ne használjon helyi változót
fixeda lambda törzsében. Azfixedutasítás rögzítési garanciája csak a környező hatókörre vonatkozik, nem pedig a fordító által generált lezárásra (CS1764). - Ne használjon lokálist
refegy lambda testen belül. A paraméterekhezrefhasonlóanrefa helyiek sem rögzíthetők a fordító által a lambda számára generált lezárásban. Rendelje hozzá az értéket egy nemrefhelyi változóhoz, vagy alakítsa át a lambdát helyi függvénysé (CS8175). - Ne használjon lambda kifejezést, névtelen metódust vagy metóduscsoportot az vagy
isoperátoraselső operandusaként. Ezek a szerkezetek nem rendelkeznek olyan típussal, amely futtatáskor tesztelhető. Először rendelje hozzá a kifejezést egy változóhoz, majd tesztelje a változót (CS0837). - Távolítsa el a
staticmódosítót a lambdából, vagy távolítsa el a rögzített változóra mutató hivatkozást. Astaticlambda kifejezetten tiltja a helyi változók, paraméterek rögzítését vagythisa nem szándékos lezárási foglalások elkerülését. Ha külső változókra kell hivatkoznia, távolítsa el astaticmódosítót. Ha minimálisan szeretné tartani a halomfoglalást, adja át az értékeket paraméterként a lambdának (CS8820, CS8821). - Távolítsa el a InterpolatedStringHandlerArgumentAttribute lambda paramétert, vagy helyezze át a logikát egy olyan metódusba, ahol az attribútumot tiszteletben tartják. A fordító figyelmen kívül hagyja ezt az attribútumot a lambda-paramétereken, mert a lambda-meghívások nem ugyanazt az interpolált sztring kezelési mechanizmust használják, mint a normál metódushívások (CS8971).
- Kerülje a virtuális tag meghívását a
basekulcsszón keresztül egy lambda vagy névtelen metóduson belül. A fordító egy nem virtuális hívást hoz létre egy segédmetóduson keresztül, amely nem ellenőrizhető kódot hoz létre. Fontolja meg abasehívás külön metódusba való kinyerését, és a metódus meghívását a lambda helyett (CS1911). - Csökkentse a lambdakifejezéseket elfogadó túlterhelt metódushívások összetettségét, vagy adjon hozzá explicit típusadatokat. Ha a fordítónak többször is meg kell kötnie egy lambda kifejezést a túlterhelések feloldásához, akkor ezt az információs diagnosztikát bocsátja ki. Ha explicit paramétertípusokkal deklarálja a lambdát, vagy explicit típusargumentumokat ad meg az általános metódushíváshoz, azzal csökkenti a fordító által teljesítendő kötések számát (CS9236).
Lambda-kifejezés paraméterei és visszaadása
- CS0748: Inkonzisztens lambda paraméterhasználat; a paramétertípusoknak explicitnek vagy minden implicitnek kell lenniük.
- CS1065: Az alapértelmezett értékek ebben a környezetben nem érvényesek.
- CS1643: Nem minden kódútvonal ad vissza "típus" típusú névtelen metódusban lévő értéket.
- CS1661: A névtelen metódusblokk nem konvertálható típussá, mert a paramétertípusok nem felelnek meg a delegált paramétertípusoknak.
- CS1662: A névtelen metódusblokk nem konvertálható a kívánt delegált típussá, mert a blokk egyes visszatérési típusai nem konvertálhatók implicit módon a delegált visszatérési típussá.
- CS1676: A "number" paramétert a "kulcsszó" kulcsszóval kell deklarálni.
- CS1677: A "number" paraméter nem deklarálható a "kulcsszó" kulcsszóval.
- CS1678: A "number" paraméter "type1" típusként van deklarálva, de "type2" legyen.
- CS1688: A paraméterlista nélküli névtelen metódusblokk nem konvertálható delegált típusú delegálásra, mert egy vagy több kimenő paraméterrel rendelkezik.
- CS1731: A kifejezés nem konvertálható delegálttá, mert a blokk egyes visszatérési típusai nem konvertálhatók implicit módon a delegált visszatérési típussá.
- CS1732: Várt paraméter.
- CS8030: Érvénytelensé konvertált névtelen függvény nem tud értéket visszaadni.
- CS8916: A lambda kifejezések attribútumai zárójeles paraméterlistát igényelnek.
- CS8934: A névtelen metódus nem konvertálható típussá, mert a visszatérési típus nem egyezik a meghatalmazott visszatérési típusával.
- CS8975: A környezetfüggő "var" kulcsszó nem használható explicit lambda visszatérési típusként.
- CS9098: Implicit módon beírt lambda paraméter : "..." Nem lehet alapértelmezett érték.
Ezek a hibák a lambda kifejezésparaméterrel vagy a visszatérési típus deklarációjával kapcsolatos problémát jeleznek. A lambdaparaméterekre és a visszatérési típusokra vonatkozó teljes szabályokért tekintse meg a lambdakifejezéseket, a névtelen metódusokat és a C# specifikáció névtelen függvénykifejezések szakaszát.
Megjegyzés:
A CS1731 és a CS1732 már nem a C#-fordító (Roslyn) jelenlegi verziója által készült. Ezek akkor jelenhetnek meg, ha régebbi fordítóverziót használ.
Ezeket a hibákat az alábbi útmutatóval háríthatja el:
- Győződjön meg arról, hogy a lambda kifejezés összes paramétere ugyanazt a gépelési stílust használja. Ha egy lambda több paraméterrel rendelkezik, mindegyik paramétert explicit módon vagy implicit módon kell beírni – a két stílus nem keverhető ugyanabban a paraméterlistában (CS0748).
- Adjon hozzá explicit típusokat minden alapértelmezett értékkel rendelkező lambda paraméterhez. A fordító explicit típusokat igényel az alapértelmezett paraméterekhez, mert létre kell hoznia egy egyéni delegálttípust, amely az alapértelmezett értéket kódolja. Az implicit módon beírt paraméterek nem nyújtanak elegendő információt ahhoz, hogy a fordító létrehozhassa ezt a delegálttípust (CS1065, CS9098).
- Távolítsa el az alapértelmezett paraméterértékeket az
delegateoperátorral deklarált névtelen metódusokból. Az alapértelmezett paraméterértékek csak lambda kifejezésekben támogatottak, névtelen metódusokban nem. Ha alapértelmezett értékekre (CS1065) van szüksége, konvertálja a névtelen metódust lambda kifejezéssé. - Egyeztesse a lambda vagy névtelen metódus paramétertípusait,
ref/out/inmódosítóit és paramétereinek számát a céldelegált típusával. A fordító pontos egyezést hajt végre a paraméter-aláírásokkal, amikor egy névtelen függvényt delegálttá alakítja: minden paraméternek a megfelelő típussal kell rendelkeznie, és mindenref,out, vagyinmódosítónak pontosan akkor kell jelen lennie, amikor a delegált elvárja (CS1661, CS1676, CS1677, CS1678). - Adjon hozzá paraméterlistát a névtelen metódushoz, ha a céldelegált típusa paraméterekkel rendelkezik
out. A paraméterlista nélkül deklarált névtelen metódusok (szintaxis használatávaldelegate { }) megfelelnek a legtöbb delegált típusnak, de a fordító nem tudja implicit módon szintetizálni a szükségesoutparamétereket. Deklarálja a paramétereket kifejezetten a delegált aláírásnak (CS1688) megfelelően. - Győződjön meg arról, hogy a lambda vagy névtelen metódus összes kódútvonala akkor ad vissza értéket, ha a céldelegált típusa érvénytelen visszatérési típussal rendelkezik. A törzs minden ágának olyan visszatérési értéket kell létrehoznia, amely implicit módon konvertálható a delegált visszatérési típusára (CS1643, CS1662, CS1731, CS8934).
- Távolítsa el az olyan
returnutasításokat, amelyek értéke egy lambda vagy egy névtelen metódus, és egyvoidvisszatérési típusú delegált típushoz, példáulAction, van hozzárendelve. Mivel a delegált visszatérési típusa azvoid, a törzs nem tud értéket visszaadni (CS8030). - Csatolja a paraméterlistát zárójelek közé, ha az attribútumok bármely lambda paraméterre vonatkoznak. A fordítónak zárójeles formában kell megkülönböztetnie az attribútum szintaxisát más kifejezésektől. Például írja be a
([MyAttribute] int x) => xa[MyAttribute] x => xhelyett (CS8916). - A lambda kifejezés explicit visszatérési típusa helyett
varhasználjon egy adott típusnevet. A kulcsszóvarimplicit módon beírt helyi változók számára van fenntartva, és nem használható lambda visszatérési típusú széljegyzetként. Adja meg a tényleges visszatérési típust, vagy hagyja ki a visszatérési típust, és hagyja kikövetkeztetni a fordítót (CS8975). - Javítsa ki a paraméterlistát, hogy a fordító felismerje érvényes paraméterdeklarációként. Ez a hiba hibásan formázott paraméterlistát jelez, ahol a fordító várt egy paraméterazonosítót, de talált valami mást (CS1732).
Lambda kifejezés delegált típusa
- CS0407: A "metódus" helytelen visszatérési típussal rendelkezik.
- CS0428: Az "Azonosító" metóduscsoport nem delegált típussá nem konvertálható. Meg akarta hívni a metódust?
- CS0467: Figyelmeztetés: Kétértelműség a metódus és a "nem metódus" metódus között. Metóduscsoport használata.
- CS0815: A "kifejezés" nem rendelhető implicit típusú változóhoz.
- CS0828: A "kifejezés" nem rendelhető névtelen típustulajdonsághoz.
- CS1660: A lambda kifejezés nem konvertálható "típus" típussá, mert nem delegált típus.
- CS8917: A meghatalmazott típusa nem vonható le.
- CS8974: Figyelmeztetés: Metóduscsoport "metódus" konvertálása nem delegált típusú "típusra". Meg akarta hívni a metódust?
- CS9099: Figyelmeztetés: Az alapértelmezett paraméter értéke nem egyezik a céldelegált típusával.
- CS9100: Figyelmeztetés: A paraméter params módosítót tartalmaz lambda kifejezésben, de nem a céldelegált típusában.
Ezek a hibák azt a delegálási típust jelzik, amelyet a fordító egy lambdakifejezésre, névtelen metódusra vagy metóduscsoportra következtet vagy vár. A delegált konverziókra vonatkozó teljes szabályokért tekintse meg a lambdakifejezéseket, a névtelen metódusokat és a C#-specifikáció névtelen függvénykifejezések szakaszát.
Megjegyzés:
A C#-fordító (Roslyn) jelenlegi verziója nem készít CS0467-et. Ez a hiba akkor jelenhet meg, ha régebbi fordítóverziót használ.
Ezeket a hibákat az alábbi útmutatóval háríthatja el:
- Győződjön meg arról, hogy a hozzárendelés vagy átalakítás céltípusa delegált típus vagy System.Linq.Expressions.Expression. A lambda kifejezés vagy névtelen metódus nem rendelhető hozzá nem delegált típushoz, például
objectinterfészhez. Módosítsa a változó típusát kompatibilis delegálási típusra( vagyFunc<>Action<>), vagy hagyjavar, hogy a fordító a delegálás típusát (CS1660) következtethesse. - Adjon meg elegendő kontextust ahhoz, hogy a fordító meghatározhassa a lambda kifejezés egyetlen delegálttípusát. Ha hozzá van
varrendelve, a fordítónak egyértelmű visszatérési típusra és paraméterlistára van szüksége. Névtelen típustulajdonsághoz rendelve a fordító egyáltalán nem tud delegált típust kikövetkeztetni. Rendelje hozzá a lambdát egy explicit delegált típusú változóhoz, majd használja ezt a változót a névtelen típus inicializálójában (CS0815, CS0828, CS8917). - Egyeztesse a metóduscsoport visszatérési típusát a delegált deklarált visszatérési típusával. A metóduscsoport-átalakításhoz a metódus visszatérési típusának identitáskonvertálhatónak vagy implicit módon átalakíthatónak kell lennie a meghatalmazott visszatérési típusára. Módosítsa a metódus visszatérési típusát, vagy módosítsa a delegált típusát egyezőre (CS0407).
- A metódus meghívása a metóduscsoport hozzárendelése helyett, ha a céltípus nem delegált. Ha a céltípus
string,intvagy egy másik nem delegált típus, akkor valószínűleg meg szeretné hívni a metódust, és hozzárendelni annak eredményét. Adjon hozzá zárójeleket és argumentumokat a metódus meghívásához (CS0428, CS8974). - Oldja fel a metódus és az azonos nevű nem metódustag közötti félreérthetőséget. Nevezze át az ütköző tagok egyikét, vagy használjon teljes körű hivatkozást a kétértelműség (CS0467) eltávolításához.
- Távolítsa el az alapértelmezett paraméterértéket vagy
paramsmódosítót a lambdából, ha a céldelegált típusa standardFunc<>vagyAction<>típus. Az alapértelmezett értékek ésparamsmódosítók miatt a fordító olyan egyéni delegálttípust hoz létre, amely nem egyezikFunc<>vagyAction<>. Használja avarlehetőséget a fordítónak, hogy szintetizálja a megfelelő delegált típust, vagy távolítsa el az alapértelmezett értéket vagy aparamsmódosítót, hogy a lambda kifejezés illeszkedjen a deklarált delegált típushoz (CS9099, CS9100).