Megosztás a következőn keresztül:


Hibák és figyelmeztetések lambdakifejezések és névtelen függvények használatakor

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ó inref vagy out paramé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ó var 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.

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 is több as operátor első operandusa nem lehet lambda kifejezés, névtelen metódus vagy metóduscsoport.
  • CS1621: Az yield utasí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, ref vagy out paramé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őleges yield break vagy utasítást, vagy átalakíthatja a lambdát egy helyi függvénysé, amely támogatja yield az utasításokat (CS1621).
  • Kerülje a lambda törzsében található beágyazási módszer hivatkozásait vagy inparamétereit.refout Ha a lambda lezárás részeként rögzíti ezeket a paramétereket, az olyan paraméterek referencia-szemantikája, mint amilyen a ref, 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, goto vagy continue, 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.
  • struct Egy 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íti this a structlambdá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 fixed a lambda törzsében. Az fixed utasí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álistref egy lambda testen belül. A paraméterekhez ref hasonlóan ref a 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 nemref helyi 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 is operátor as első 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 static módosítót a lambdából, vagy távolítsa el a rögzített változóra mutató hivatkozást. A static lambda kifejezetten tiltja a helyi változók, paraméterek rögzítését vagy this a 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 a static mó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 base kulcsszó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 a base hí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 delegate operá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/in mó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 minden ref, out, vagy in mó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ával delegate { } ) megfelelnek a legtöbb delegált típusnak, de a fordító nem tudja implicit módon szintetizálni a szükséges out paramé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 return utasításokat, amelyek értéke egy lambda vagy egy névtelen metódus, és egy void visszatérési típusú delegált típushoz, például Action, van hozzárendelve. Mivel a delegált visszatérési típusa az void, 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) => x a [MyAttribute] x => x helyett (CS8916).
  • A lambda kifejezés explicit visszatérési típusa helyett var haszná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 object interfészhez. Módosítsa a változó típusát kompatibilis delegálási típusra( vagy Func<>Action<>), vagy hagyja var , 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 params módosítót a lambdából, ha a céldelegált típusa standard Func<> vagy Action<> típus. Az alapértelmezett értékek és params módosítók miatt a fordító olyan egyéni delegálttípust hoz létre, amely nem egyezik Func<> vagy Action<>. Használja a var lehető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 a params módosítót, hogy a lambda kifejezés illeszkedjen a deklarált delegált típushoz (CS9099, CS9100).