Chyby a upozornění při použití výrazů lambda a anonymních funkcí
Deklarace a používání výrazů lambda souvisí s několika chybami :
- CS0748: Nekonzistentní použití parametru lambda; typy parametrů musí být explicitní nebo všechny implicitní.
- CS1621: Příkaz yield nelze použít uvnitř anonymní metody nebo výrazu lambda.
- CS1628: Nelze použít nebo
out
parametrin
ref
uvnitř anonymní metody, výrazu lambda nebo výrazu dotazu. - CS1632: Ovládací prvek nemůže opustit tělo anonymní metody nebo výraz lambda.
- CS1673: Anonymní metody, výrazy lambda a výrazy dotazů uvnitř struktur nemají přístup k členům instance 'this'.
- CS1686: Místní proměnná nebo její členové nemohou mít svoji adresu a použít ji uvnitř anonymní metody nebo výrazu lambda.
- CS1706: Výraz nemůže obsahovat anonymní metody ani výrazy lambda.
- CS8030: Anonymní funkce převedená na neplatný delegát nemůže vrátit hodnotu.
- CS8175: Nelze použít ref local uvnitř anonymní metody, výrazu lambda nebo výrazu dotazu.
- CS8916: Atributy výrazů lambda vyžadují seznam závorek parametrů.
- CS8971: InterpolatedStringHandlerArgument nemá žádný vliv při použití na parametry lambda a bude ignorován v lokalitě volání.
- CS8975: Kontextové klíčové slovo
var
nelze použít jako explicitní návratový typ lambda. - CS9098: Implicitně zadaný parametr lambda ... aplikace nemůže mít výchozí hodnotu.
Kromě toho existuje několik upozornění souvisejících s deklarací a používáním výrazů lambda:
- CS8971: InterpolatedStringHandlerArgument nemá žádný vliv při použití na parametry lambda a bude ignorován v lokalitě volání.
- CS9099: Výchozí hodnota parametru se neshoduje s typem cílového delegáta.
- CS9100: Parametr má modifikátor parametrů v lambda, ale ne v cílovém typu delegáta.
Omezení syntaxe ve výrazech lambda
Některé syntaxe jazyka C# jsou zakázány ve výrazech lambda a anonymních metodách. Použití neplatných konstruktorů ve výrazu lambda způsobuje následující chyby:
- CS1621: Příkaz
yield
nelze použít uvnitř anonymní metody nebo výrazu lambda. - CS1628: Nelze použít
in
,ref
neboout
parametr uvnitř anonymní metody, výrazu lambda nebo výrazu dotazu. - CS1632: Ovládací prvek nemůže opustit tělo anonymní metody nebo výraz lambda.
- CS1673: Anonymní metody, výrazy lambda a výrazy dotazů uvnitř struktur nemohou přistupovat k členům
this
instance . - CS1686: Místní proměnná nebo její členové nemohou mít svoji adresu a použít ji uvnitř anonymní metody nebo výrazu lambda.
- CS8175: Nelze použít ref local uvnitř anonymní metody, výrazu lambda nebo výrazu dotazu.
Ve výrazech lambda jsou zakázány všechny následující konstrukty:
yield
příkazy (yield return
neboyield break
)- Volání metody, která má
in
parametr ,ref
neboout
ref
místní proměnnébreak
,goto
acontinue
příkazythis
access whenthis
is astruct
type- Anonymní metody nebo výrazy lambda uvnitř jiného výrazu, například konstruktor Attribute.
Žádný z těchto konstruktorů nelze použít ve výrazu lambda ani v anonymní metodě. Mnoho z nich je povoleno v místní funkci.
Kromě toho se typy interpolovaných popisovačů řetězců při použití na parametr lambda ignorují. Pokud ji použijete, zobrazí se následující upozornění:
- CS8971: InterpolatedStringHandlerArgument nemá žádný vliv při použití na parametry lambda a bude ignorován v lokalitě volání.
Parametry výrazu lambda a vrácení
Tyto chyby značí problém s deklarací parametru:
- CS0748: Nekonzistentní použití parametru lambda; typy parametrů musí být explicitní nebo všechny implicitní.
- CS9098: Implicitně zadaný parametr lambda ... aplikace nemůže mít výchozí hodnotu.
- CS8030: Anonymní funkce převedená na neplatný delegát nemůže vrátit hodnotu.
- CS8916: Atributy výrazů lambda vyžadují seznam závorek parametrů.
- CS8975: Kontextové klíčové slovo var nelze použít jako explicitní návratový typ lambda.
Parametry výrazu lambda musí dodržovat tato pravidla:
- Pokud má výraz lambda více parametrů, musí být buď zadány všechny parametry explicitně, nebo všechny parametry musí být implicitně zadány.
- Všechny parametry lambda s výchozí hodnotou musí být explicitně zadány.
- Pokud jsou atributy použity na jakékoli parametry, seznam parametrů musí být uzavřen v závorkách.
Návratové typy výrazu lambda musí dodržovat tato pravidla:
- Výraz lambda, který vrací jakoukoli hodnotu, nelze převést na vráceného delegáta
void
, napříkladAction
. - Návratový typ je odvozen nebo explicitní typ. Návratový typ deklarovaný pomocí klíčového slova
var
není povolený.
Typ delegáta výrazu lambda
- CS9099: Upozornění: Výchozí hodnota parametru se neshoduje s typem cílového delegáta.
Když deklarujete výchozí hodnotu nebo přidáte params
modifikátor s parametrem výrazu lambda, typ delegáta není jedním z těchto Func
typů.Action
Jedná se spíše o vlastní typ, který obsahuje výchozí hodnotu parametru nebo params
modifikátor. Následující kód generuje upozornění, protože přiřadí výraz lambda, který má výchozí parametr typu Action
:
Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };
Chybu opravíte tak, že odeberete výchozí parametr nebo použijete implicitně za typ delegáta proměnnou:
Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };