Sdílet prostřednictvím


Chyby a upozornění při použití výrazů lambda a anonymních funkcí

Několik chyb souvisí s deklarací a používáním výrazů lambda a anonymních metod:

  • CS0407: Metoda má nesprávný návratový typ.
  • CS0428: Nelze převést skupinu metod 'Identifikátor' na ne-delegátský typ 'type'. Chtěli jste vyvolat metodu?
  • CS0748: Nekonzistentní použití parametru lambda; typy parametrů musí být explicitní nebo všechny implicitní.
  • CS0815: Výraz nelze přiřadit implicitně zadané proměnné.
  • CS0828: Nelze přiřadit výraz k vlastnosti anonymního typu.
  • CS0837: Prvním operandem operátoru is nebo as nemusí být výraz lambda, anonymní metoda nebo skupina metod.
  • CS1065: Výchozí hodnoty nejsou v tomto kontextu platné.
  • CS1621: Příkaz yield nelze použít uvnitř anonymní metody nebo výrazu lambda.
  • CS1628: Nelze použít parametr inref nebo out uvnitř anonymní metody, lambda výrazu nebo dotazu.
  • CS1632: Kontrola nemůže opustit tělo anonymní metody nebo výrazu lambda.
  • CS1643: Ne všechny cesty kódu vrací hodnotu v anonymní metodě typu type 'type'.
  • CS1660: Výraz lambda nelze převést na typ "type", protože není typem delegáta.
  • CS1661: Blok anonymní metody nelze převést na typ Type, protože typy parametrů neodpovídají typům parametrů delegáta.
  • CS1662: Anonymní blok metody nelze převést na zamýšlený typ delegáta, protože některé návratové typy v bloku nejsou implicitně převedeny na návratový typ delegáta.
  • CS1673: Anonymní metody, výrazy lambda a výrazy dotazů uvnitř struktur nemají přístup k členům instance 'this'.
  • CS1676: Parametr number musí být deklarován klíčovým slovem "keyword".
  • CS1677: Parametr number by neměl být deklarován klíčovým slovem "keyword".
  • CS1678: Parametr number je deklarován jako typ type1, ale měl by být type2.
  • CS1686: Místní proměnná nebo její členové nemohou mít svou adresu vzatou a být použity uvnitř anonymní metody nebo lambda výrazu.
  • CS1688: Nelze převést blok anonymní metody bez seznamu parametrů na delegovaný typ "delegate", protože má jeden nebo více výstupních parametrů.
  • CS1706: Výraz nemůže obsahovat anonymní metody ani výrazy lambda.
  • CS1731: Výraz nelze převést na delegáta, protože některé návratové typy v bloku nejsou implicitně převedeny na návratový typ delegáta.
  • CS1732: Očekávaný parametr.
  • CS1764: Nelze použít pevné lokální proměnné uvnitř anonymní metody, lambda výrazu nebo dotazovacího výrazu.
  • 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.
  • CS8820: Statická anonymní funkce nemůže obsahovat odkaz na proměnnou.
  • CS8821: Statická anonymní funkce nemůže obsahovat odkaz na "this" nebo "base".
  • CS8916: Atributy výrazů lambda vyžadují seznam závorek parametrů.
  • CS8917: Typ delegáta nelze odvodit.
  • CS8934: Nelze převést anonymní metodu na typ "type", protože návratový typ neodpovídá návratovém typu delegáta.
  • CS8975: Kontextové klíčové slovo var nelze použít jako explicitní návratový typ lambda.
  • CS9098: Implicitně typovaný parametr lambda '...' nemůže mít výchozí hodnotu.

Kromě toho několik upozornění souvisí s deklarací a používáním výrazů lambda:

  • CS0467: Nejednoznačnost mezi metodou "method" a jinou metodou "non-method". Použití skupiny metod
  • CS1911: Přístup k členovi prostřednictvím základního klíčového slova z anonymní metody, výrazu lambda, výrazu dotazu nebo iterátoru způsobí neověřitelný kód.
  • CS8971: InterpolatedStringHandlerArgument nemá žádný vliv při použití na parametry lambda a bude ignorován v lokalitě volání.
  • CS8974: Převádíte skupinu metod „method“ na ne-delegátový typ „type“. Chtěli jste metodu vyvolat?
  • 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.

Kompilátor také vytvoří následující informační zprávu:

  • CS9236: Kompilace vyžaduje vazbu lambda výrazu alespoň několikrát. Zvažte deklarování lambda výrazu s explicitními typy parametrů nebo pokud je volání v rámci metody generické, zvažte použití explicitních argumentů typu.

Omezení syntaxe ve výrazech lambda

  • CS0837: Prvním operandem nebo is operátorem as nemusí být výraz lambda, anonymní metoda nebo skupina metod.
  • 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: Na adresu místní proměnné nebo jejích členů nelze odkazovat a použít ji uvnitř anonymní metody nebo lambda výrazu.
  • CS1706: Výraz nemůže obsahovat anonymní metody ani výrazy lambda.
  • CS1764: Nelze použít pevnou místní proměnnou uvnitř anonymní metody, výrazu lambda nebo výrazu dotazu.
  • CS1911: Upozornění: Přístup k členovi prostřednictvím klíčového slova "base" z anonymní metody, výrazu lambda, výrazu dotazu nebo iterátoru způsobí neověřitelný kód.
  • CS8175: Nelze použít ref local uvnitř anonymní metody, výrazu lambda nebo výrazu dotazu.
  • CS8820: Statická anonymní funkce nemůže obsahovat odkaz na proměnnou.
  • CS8821: Statická anonymní funkce nemůže obsahovat odkaz na "this" nebo "base".
  • CS8971: Upozornění: InterpolatedStringHandlerArgument nemá žádný vliv při použití na parametry lambda a bude ignorován v lokalitě volání.
  • CS9236: Informační: Kompilace vyžaduje svázání lambda výrazu alespoň několikrát. Zvažte deklarování lambda výrazu s explicitními typy parametrů nebo, je-li volání metody obecné, zvažte použití explicitních typových argumentů.

Kompilátor zakáže určité konstruktory jazyka C# uvnitř výrazů lambda a anonymních metod. Tato omezení existují, protože kompilátor transformuje lambda a anonymní metody na delegování vyvolání nebo stromy výrazů a některé konstrukce nelze v těchto formulářích reprezentovat. Další informace naleznete v části výrazy anonymní funkce specifikace jazyka C#.

Tyto chyby můžete opravit pomocí následujících doprovodných materiálů:

  • Přesuňte libovolný yield return nebo yield break příkaz z těla lambda a do ohraničující metody iterátoru nebo převeďte lambda na místní funkci, která podporuje yield příkazy (CS1621).
  • Vyhněte se odkazování in, refnebo out parametrů z uzavřené metody uvnitř těla lambda. Když lambda tyto parametry zachytí jako součást uzavření, nelze zachovat jejich referenční sémantiku pro parametry podobné ref. Zkopírujte hodnotu do místní proměnné a místo toho ji použijte nebo převeďte lambda na místní funkci (CS1628).
  • Odeberte všechny příkazy break, goto nebo continue, které přenášejí kontrolu z těla lambda. Příkazy toku řízení musí cílit na popisky nebo smyčky ve stejném textu lambda (CS1632).
  • Vyhněte se odkazování na instanční členy prostřednictvím this v lambda výrazu, anonymní metodě nebo výrazu dotazu uvnitř typu struct. Vzhledem k tomu, že kompilátor zachycuje this podle hodnoty v objektu struct, nemají změny uvnitř lambda vliv na původní instanci. Extrahujte potřebné členské hodnoty do místních proměnných před lambdou nebo převeďte na místní funkci, která má přímý přístup k this (CS1673).
  • Nezískávejte adresu místní proměnné, kterou lambda rovněž zachytává. Kompilátor přesune zachycené proměnné do objektu uzavření přiděleného haldou, takže jejich adresa bude nestabilní. Oddělte logiku přebírání adres od lambda nebo místo toho použijte místní funkci (CS1686).
  • Přesuňte výraz lambda nebo anonymní metodu ze složeného výrazu, který jejich použití omezuje. Některé výrazy, jako jsou konstruktory atributů, nepodporují výrazy lambda ani anonymní metody jako argumenty (CS1706).
  • Nepoužívejte místní proměnnou fixed uvnitř těla lambda. Záruka připnutí příkazu fixed platí pouze pro daný obor platnosti, nikoli pro uzavření, které generuje kompilátor (CS1764).
  • Nepoužívejte ref lokální proměnnou uvnitř těla lambda. Podobně jako ref parametry není možné zachytávat místní hodnoty v uzavření, ref které kompilátor vygeneruje pro lambda. Přiřaďte hodnotu jiné nežref místní proměnné nebo převeďte lambda na místní funkci (CS8175).
  • Nepoužívejte lambda výraz, anonymní metodu nebo skupinu metod jako první operand operátorů is nebo as. Tyto konstrukce nemají typ, který je možné testovat za běhu. Nejprve přiřaďte výraz proměnné a pak otestujte proměnnou (CS0837).
  • static Odeberte modifikátor z lambda nebo odeberte odkaz na zachycenou proměnnou. Lambdastatic explicitně zakazuje zachytávání místních proměnných, parametrů nebo jiných prvků, aby se zabránilo nechtěným přidělením spojeným s uzavřeními. Pokud potřebujete odkazovat na vnější proměnné, odeberte static modifikátor. Pokud chcete zachovat přidělení haldy minimální, předejte hodnoty jako parametry do lambda (CS8820, CS8821).
  • Odeberte InterpolatedStringHandlerArgumentAttribute z parametru lambda, nebo přesuňte logiku do metody, kde se atribut uplatňuje. Kompilátor ignoruje tento atribut u parametrů lambda, protože volání lambda nepoužívají stejnou redukci obslužné rutiny interpolovaných řetězců jako běžná volání metod (CS8971).
  • Vyhněte se volání virtuálního člena uvnitř lambda nebo anonymní metody prostřednictvím klíčového slova base. Kompilátor generuje ne-virtuální volání prostřednictvím pomocné metody, která vytváří neověřitelný kód. Zvažte extrahování base volání do samostatné metody a volání této metody z lambda (CS1911).
  • Snižte složitost přetížených volání metod, která přijímají výrazy lambda, nebo přidejte explicitní informace o typu. Když kompilátor musí několikrát svázat výraz lambda k vyřešení přetížení, vygeneruje tuto informační diagnostiku. Deklarování lambda pomocí explicitních typů parametrů nebo poskytnutí explicitních argumentů typů při volání obecné metody snižuje počet návazností, které musí kompilátor provést (CS9236).

Parametry výrazu lambda a návratové hodnoty

  • CS0748: Nekonzistentní použití parametru lambda; typy parametrů musí být explicitní nebo všechny implicitní.
  • CS1065: Výchozí hodnoty nejsou v tomto kontextu platné.
  • CS1643: Ne všechny cesty kódu vrací hodnotu v anonymní metodě typu type 'type'.
  • CS1661: Blok anonymní metody nelze převést na typ Type, protože typy parametrů neodpovídají typům parametrů delegáta.
  • CS1662: Anonymní blok metody nelze převést na zamýšlený typ delegáta, protože některé návratové typy v bloku nejsou implicitně převedeny na návratový typ delegáta.
  • CS1676: Parametr number musí být deklarován klíčovým slovem "keyword".
  • CS1677: Parametr number by neměl být deklarován klíčovým slovem "keyword".
  • CS1678: Parametr number je deklarován jako typ type1, ale měl by být type2.
  • CS1688: Nelze převést blok anonymní metody bez seznamu parametrů na delegovaný typ "delegate", protože má jeden nebo více výstupních parametrů.
  • CS1731: Výraz nelze převést na delegáta, protože některé návratové typy v bloku nejsou implicitně převedeny na návratový typ delegáta.
  • CS1732: Očekávaný parametr.
  • CS8030: Anonymní funkce převedená na delegáta vracejícího void nemůže vrátit hodnotu.
  • CS8916: Atributy výrazů lambda vyžadují seznam závorek parametrů.
  • CS8934: Nelze převést anonymní metodu na typ "type", protože návratový typ neodpovídá návratovém typu delegáta.
  • CS8975: Kontextové klíčové slovo var nelze použít jako explicitní návratový typ lambda.
  • CS9098: Implicitně zadaný parametr lambda '...' nemůže mít výchozí hodnotu.

Tyto chyby označují problém s parametrem výrazu lambda nebo deklarací návratového typu. Úplná pravidla pro parametry lambda a návratové typy najdete v tématu výrazy lambda, anonymní metody a část výrazů anonymních funkcí specifikace jazyka C#.

Poznámka:

CS1731 a CS1732 už nejsou vytvářeny aktuální verzí kompilátoru jazyka C# (Roslyn). Můžou se zobrazit, pokud používáte starší verzi kompilátoru.

Tyto chyby můžete opravit pomocí následujících doprovodných materiálů:

  • Ujistěte se, že všechny parametry ve výrazu lambda používají stejný styl psaní. Pokud má lambda více parametrů, musí být každý parametr buď explicitně zadaný , nebo implicitně zadaný – nemůžete kombinovat dva styly ve stejném seznamu parametrů (CS0748).
  • Přidejte explicitní typy do libovolného parametru lambda, který má výchozí hodnotu. Kompilátor vyžaduje explicitní typy parametrů s výchozími hodnotami, protože musí vygenerovat vlastní typ delegáta, který zakóduje výchozí hodnotu. Implicitně zadané parametry neposkytují dostatek informací pro kompilátor k vytvoření typu delegáta (CS1065, CS9098).
  • Odeberte výchozí hodnoty parametrů z anonymních metod deklarovaných pomocí operátorudelegate. Výchozí hodnoty parametrů jsou podporovány pouze ve výrazech lambda, ne v anonymních metodách. Pokud potřebujete výchozí hodnoty (CS1065), převeďte anonymní metodu na výraz lambda.
  • Porovná typy parametrů, ref/out/inmodifikátory a počet parametrů lambda nebo anonymní metody s cílovým typem delegáta. Kompilátor provádí přesnou shodu podpisů parametrů při převodu anonymní funkce na delegáta: každý parametr musí mít správný typ a jakýkoli ref, outnebo in modifikátor musí být k dispozici přesně tehdy, když ho delegát očekává (CS1661, CS1676, CS1677, CS1677, CS1678).
  • Pokud má out typ cílového delegáta parametry, přidejte do anonymní metody seznam parametrů. Anonymní metoda deklarovaná bez seznamu parametrů (pomocí delegate { } syntaxe) může odpovídat většině typů delegátů, ale kompilátor nemůže implicitně syntetizovat požadované out parametry. Deklarujte parametry explicitně tak, aby odpovídaly podpisu delegáta (CS1688).
  • Zajistěte, aby všechny cesty kódu v lambda nebo anonymní metodě vrátily hodnotu, pokud typ cílového delegáta má nevoid návratový typ. Každá větev těla musí mít návratovou hodnotu, která je implicitně konvertibilní na návratový typ delegáta (CS1643, CS1662, CS1731, CS8934).
  • Odeberte všechny return příkazy s hodnotou z lambdy nebo anonimní metody, která je přiřazena typu delegáta vracejícího void, například Action. Protože návratový typ delegáta je void, tělo nemůže vrátit hodnotu (CS8030).
  • Uzavřete seznam parametrů do závorek, pokud jsou atributy použity na libovolný parametr lambda. Kompilátor potřebuje závorkový formulář k rozlišení syntaxe atributů od jiných výrazů. Například zapište ([MyAttribute] int x) => x místo [MyAttribute] x => x (CS8916).
  • Místo var použijte název konkrétního typu jako explicitní návratový typ výrazu lambda. Klíčové slovo var je vyhrazeno pro implicitně zadané místní proměnné a nelze ho použít jako poznámku k návratu typu lambda. Zadejte skutečný návratový typ, nebo vypusťte návratový typ a nechte kompilátor odvodit (CS8975).
  • Opravte seznam parametrů, aby ho kompilátor mohl rozpoznat jako platnou deklaraci parametru. Tato chyba označuje poškozený seznam parametrů, kde kompilátor očekával identifikátor parametru, ale našel něco jiného (CS1732).

Typ delegáta výrazu lambda

  • CS0407: Metoda má nesprávný návratový typ.
  • CS0428: Nelze převést skupinu metod Identifikátor na typ "type". Chtěli jste vyvolat metodu?
  • CS0467: Upozornění: Nejednoznačnost mezi metodou "method" a jinou metodou "non-method". Použití skupiny metod
  • CS0815: Výraz nelze přiřadit implicitně zadané proměnné.
  • CS0828: Nelze přiřadit výraz k vlastnosti anonymního typu.
  • CS1660: Výraz lambda nelze převést na typ "type", protože není typem delegáta.
  • CS8917: Typ delegáta nelze odvodit.
  • CS8974: Upozornění: Převod skupiny metod na nedelový typ „type“. Měli jste v úmyslu vyvolat metodu?
  • CS9099: Upozornění: Výchozí hodnota parametru se neshoduje s typem cílového delegáta.
  • CS9100: Upozornění: Parametr má modifikátor parametrů v lambda, ale ne v cílovém typu delegáta.

Tyto chyby značí problém s typem delegáta , který kompilátor odvodí nebo očekává pro výraz lambda, anonymní metodu nebo skupinu metod. Úplná pravidla pro převody delegátů najdete v tématu výrazy lambda, anonymní metody a část výrazů anonymních funkcí specifikace jazyka C#.

Poznámka:

Aktuální verze kompilátoru jazyka C# (Roslyn) nevygeneruje CS0467. Tato chyba se může zobrazit, pokud používáte starší verzi kompilátoru.

Tyto chyby můžete opravit pomocí následujících doprovodných materiálů:

  • Ujistěte se, že cílový typ přiřazení nebo převodu je typ delegáta nebo System.Linq.Expressions.Expression. Výraz lambda nebo anonymní metoda nelze přiřadit k nenávratovému typu, jako je object nebo rozhraní. Změňte typ proměnné na kompatibilní typ delegáta, například Func<>Action<>nebo nebo použijte var k tomu, aby kompilátor odvozoval typ delegáta (CS1660).
  • Poskytněte dostatek kontextu pro kompilátor k určení jednoho typu delegáta pro výraz lambda. Při přiřazení varpotřebuje kompilátor jednoznačný návratový typ a seznam parametrů. Při přiřazení k vlastnosti anonymního typu nemůže kompilátor odvodit typ delegáta vůbec. Přiřaďte lambda proměnné s explicitním typem delegáta a pak tuto proměnnou použijte v inicializátoru anonymního typu (CS0815, CS0828, CS8917).
  • Porovná návratový typ skupiny metod s deklarovaným návratovým typem delegáta. Převod skupiny metod vyžaduje, aby návratový typ metody byl identitně konvertibilní nebo implicitně konvertibilní na návratový typ delegáta. Změňte návratový typ metody nebo změňte typ delegáta tak, aby odpovídal (CS0407).
  • Vyvolání metody místo přiřazení skupiny metod, pokud cílový typ není delegát. Pokud je cílový typ string, int nebo jiný nedelový typ, pravděpodobně jste chtěli zavolat metodu a přiřadit její výsledek. Přidejte závorky a argumenty pro vyvolání metody (CS0428, CS8974).
  • Vyřešte nejednoznačnost mezi metodou a jiným členem, který sdílí stejný název. Přejmenujte jeden z konfliktních členů nebo pomocí plně kvalifikovaného odkazu odeberte nejednoznačnost (CS0467).
  • Odeberte výchozí hodnotu parametru nebo params modifikátor z lambda, pokud je typ cílového delegáta standardní Func<> nebo Action<> typ. Výchozí hodnoty a params modifikátory způsobují, že kompilátor vygeneruje vlastní typ delegáta, který neodpovídá Func<> nebo Action<>. Buď použijte var k syntetizaci správného typu delegáta kompilátoru, nebo odeberte výchozí hodnotu nebo params modifikátor tak, aby lambda odpovídala deklarovanému typu delegáta (CS9099, CS9100).