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 parametr inref 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, refnebo out 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 thisinstance .
  • 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 nebo yield break)
  • Volání metody, která má inparametr , refnebo out
  • ref místní proměnné
  • break, gotoa continue příkazy
  • this access when this is a struct 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říklad Action.
  • 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) => { };