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.
A lambdakifejezések deklarálásával és használatával kapcsolatban számos hiba lépett fel:
- CS0748: Inkonzisztens lambda paraméterhasználat; a paramétertípusoknak explicitnek vagy minden implicitnek kell lenniük.
- 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.
- 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.
- 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.
- CS1706: A kifejezés nem tartalmazhat névtelen metódusokat vagy lambdakifejezéseket.
- 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.
- CS8916: A lambda kifejezések attribútumai zárójeles paraméterlistát igényelnek.
- CS8971: Az InterpolatedStringHandlerArgument nincs hatással a lambda paramétereire, és a hívás helyszínén figyelmen kívül hagyja.
-
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 a lambda kifejezések deklarálásával és használatával kapcsolatos figyelmeztetések is vannak:
- CS8971: Az InterpolatedStringHandlerArgument nincs hatással a lambda paramétereire, és a hívás helyszínén figyelmen kívül hagyja.
- 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
A lambdakifejezésekben és a névtelen metódusokban bizonyos C#-szintaxis tilos. Érvénytelen szerkezetek használata a lambda kifejezésben a következő hibákat okozza:
-
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.
- CS8175: Névtelen metóduson, lambdakifejezésen vagy lekérdezési kifejezésen belül nem használható a ref local.
A lambdakifejezésekben az alábbi szerkezetek nem engedélyezettek:
-
yieldutasítások (yield returnvagyyield break) - Egy ,
invagyrefparaméterrel rendelkezőoutmetódus meghívása -
refhelyi változók -
break,gotoéscontinueutasítások -
thishozzáférés, hathisegystructtípus - Névtelen metódusok vagy lambdakifejezések egy másik kifejezésben, például attribútumkonstruktorban.
Ezen szerkezetek egyikét sem használhatja lambda kifejezésben vagy névtelen metódusban. Egy helyi függvényben sok engedélyezett.
Emellett az interpolált sztringkezelő típusok figyelmen kívül lesznek hagyva, ha lambda paraméterre alkalmazzák. Ha használ egyet, a következő figyelmeztetés jelenik meg:
- CS8971: Az InterpolatedStringHandlerArgument nincs hatással a lambda paramétereire, és a hívás helyszínén figyelmen kívül hagyja.
Bizonyos kifejezések miatt a fordító a következő tájékoztató figyelmeztetést bocsátja ki:
- CS9236: A fordításhoz szükséges, hogy a lambda kifejezést legalább egy bizonyos számú alkalommal kössük meg. Fontolja meg a lambda kifejezés explicit paramétertípusokkal való deklarálását, vagy ha a metódushívás generikus, fontolja meg explicit típusargumentumok alkalmazását.
A lambda kifejezések összetettsége és más lambda-kifejezések meghívása negatívan befolyásolja a fordító teljesítményét. Ennek az az oka, hogy a fordítónak paraméter- és argumentumtípusokat kell kikövetkesítenie a lambda kifejezéseken keresztül, és a lehetséges típusok időt vesznek igénybe.
Lambda-kifejezés paraméterei és visszaadása
Ezek a hibák egy paraméterdeklarációval kapcsolatos problémát jeleznek:
- CS0748: Inkonzisztens lambda paraméterhasználat; a paramétertípusoknak explicitnek vagy minden implicitnek kell lenniük.
- CS9098: Implicit módon beírt lambda paraméter : "..." Nem lehet alapértelmezett érték.
- 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.
- CS8975: A környezetfüggő "var" kulcsszó nem használható explicit lambda visszatérési típusként.
A Lambda-kifejezés paramétereinek a következő szabályokat kell követniük:
- Ha egy lambda kifejezés több paraméterrel rendelkezik, akkor vagy az összes paramétert explicit módon kell begépelni, vagy az összes paramétert implicit módon kell begépelni.
- Az alapértelmezett értékkel rendelkező lambda paramétereket explicit módon kell begépelni.
- Ha attribútumokat alkalmaz bármely paraméterre, a paraméterlistát zárójelben kell megadni.
A lambda kifejezés visszatérési típusainak a következő szabályokat kell követniük:
- A lambda kifejezés, amely bármilyen értéket ad vissza, nem konvertálható
voidvisszaküldöttté, példáulAction. - A visszatérési típus vagy kikövetkeztetett, vagy explicit típus. A kulcsszóval
vardeklarált visszatérési típus nem engedélyezett.
Lambda kifejezés delegált típusa
- CS9099: Figyelmeztetés: Az alapértelmezett paraméter értéke nem egyezik a céldelegált típusával.
Ha deklarál egy alapértelmezett értéket, vagy hozzáadja a params módosítót egy lambda kifejezés paraméterrel, a delegált típus nem tartozik a Func vagy a Action típusok közé. Inkább egy egyéni típus, amely tartalmazza az alapértelmezett paraméterértéket vagy params módosítót. A következő kód figyelmeztetéseket generál, mert egy lambda kifejezést rendel hozzá, amely egy alapértelmezett paraméterrel rendelkezik egy Action típushoz:
Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };
A hiba kijavításához távolítsa el az alapértelmezett paramétert, vagy használjon implicit módon beírt változót a delegált típusához:
Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };