Błędy i ostrzeżenia podczas używania wyrażeń lambda i funkcji anonimowych

Istnieje kilka błędów związanych z deklarowaniem i używaniem wyrażeń lambda:

  • CS0748: Niespójne użycie parametrów lambda; typy parametrów muszą być jawne lub wszystkie niejawne.
  • CS1621: Instrukcja yield nie może być używana wewnątrz metody anonimowej ani wyrażenia lambda.
  • CS1628: Nie można użyć inref parametru ani out w metodzie anonimowej, wyrażeniu lambda lub wyrażeniu zapytania.
  • CS1632: Kontrolka nie może pozostawić treści anonimowej metody lub wyrażenia lambda.
  • CS1673: Metody anonimowe, wyrażenia lambda i wyrażenia zapytań wewnątrz struktur nie mogą uzyskać dostępu do elementów członkowskich wystąpienia "this".
  • CS1686: Zmienna lokalna lub jej składowe nie mogą mieć adresu i być używane wewnątrz metody anonimowej lub wyrażenia lambda.
  • CS1706: Wyrażenie nie może zawierać metod anonimowych ani wyrażeń lambda.
  • CS8030: Funkcja Anonymous przekonwertowana na delegata zwracającego wartość void nie może zwrócić wartości.
  • CS8175: Nie można użyć metody ref w metodzie anonimowej, wyrażeniu lambda lub wyrażeniu zapytania.
  • CS8916: Atrybuty w wyrażeniach lambda wymagają listy parametrów nawiasów.
  • CS8971: InterpolatedStringHandlerArgument nie ma wpływu w przypadku zastosowania do parametrów lambda i zostanie zignorowany w lokacji wywołania.
  • CS8975: Słowo kluczowe var kontekstowe nie może być używane jako jawny typ zwracany lambda.
  • CS9098: Niejawnie wpisany parametr lambda '...' program nie może mieć wartości domyślnej.

Ponadto istnieje kilka ostrzeżeń związanych z deklarowaniem i używaniem wyrażeń lambda:

  • CS8971: InterpolatedStringHandlerArgument nie ma wpływu w przypadku zastosowania do parametrów lambda i zostanie zignorowany w lokacji wywołania.
  • CS9099: Domyślna wartość parametru nie jest zgodna z typem delegata docelowego.
  • CS9100: Parametr ma modyfikator parametrów w lambda, ale nie w docelowym typie delegata.

Ograniczenia składni w wyrażeniach lambda

Niektóre składnie języka C# są zabronione w wyrażeniach lambda i metodach anonimowych. Użycie nieprawidłowych konstrukcji w wyrażeniu lambda powoduje następujące błędy:

  • CS1621: Instrukcja yield nie może być używana wewnątrz metody anonimowej ani wyrażenia lambda.
  • CS1628: Nie można użyć inparametru , reflub out w metodzie anonimowej, wyrażeniu lambda lub wyrażeniu zapytania.
  • CS1632: Kontrolka nie może pozostawić treści anonimowej metody lub wyrażenia lambda.
  • CS1673: Metody anonimowe, wyrażenia lambda i wyrażenia zapytań wewnątrz struktur nie mogą uzyskać dostępu do elementów członkowskich thiswystąpienia .
  • CS1686: Zmienna lokalna lub jej składowe nie mogą mieć adresu i być używane wewnątrz metody anonimowej lub wyrażenia lambda.
  • CS8175: Nie można użyć metody ref w metodzie anonimowej, wyrażeniu lambda lub wyrażeniu zapytania.

Wszystkie poniższe konstrukcje są niedozwolone w wyrażeniach lambda:

  • yield instrukcje (yield return lub yield break)
  • Wywoływanie metody, która ma inparametr , reflub out
  • ref zmienne lokalne
  • break, goto, i continue instrukcje
  • thisdostęp, gdy this jest typem struct
  • Metody anonimowe lub wyrażenia lambda wewnątrz innego wyrażenia, takie jak konstruktor atrybutu.

Nie można użyć żadnej z tych konstrukcji w wyrażeniu lambda ani metodzie anonimowej. Wiele z tych funkcji jest dozwolonych w funkcji lokalnej.

Ponadto typy obsługi ciągów interpolowanych są ignorowane w przypadku zastosowania do parametru lambda. Jeśli go używasz, zostanie wyświetlone następujące ostrzeżenie:

  • CS8971: InterpolatedStringHandlerArgument nie ma wpływu w przypadku zastosowania do parametrów lambda i zostanie zignorowany w lokacji wywołania.

Parametry wyrażenia lambda i zwracane

Te błędy wskazują problem z deklaracją parametru:

  • CS0748: Niespójne użycie parametrów lambda; typy parametrów muszą być jawne lub wszystkie niejawne.
  • CS9098: Niejawnie wpisany parametr lambda '...' program nie może mieć wartości domyślnej.
  • CS8030: Funkcja Anonymous przekonwertowana na delegata zwracającego wartość void nie może zwrócić wartości.
  • CS8916: Atrybuty w wyrażeniach lambda wymagają listy parametrów nawiasów.
  • CS8975: Słowo kluczowe kontekstowe "var" nie może być używane jako jawny typ zwracany lambda.

Parametry wyrażenia lambda muszą być zgodne z następującymi regułami:

  • Jeśli wyrażenie lambda ma wiele parametrów, wszystkie parametry muszą być jawnie wpisane lub wszystkie parametry muszą być niejawnie wpisane.
  • Wszystkie parametry lambda z wartością domyślną muszą być jawnie wpisane.
  • Jeśli atrybuty są stosowane do dowolnych parametrów, lista parametrów musi być ujęta w nawiasy.

Zwracane typy wyrażenia lambda muszą być zgodne z następującymi regułami:

  • Wyrażenie lambda zwracające dowolną wartość nie może zostać przekonwertowane na zwracanego delegata void , takiego jak Action.
  • Zwracany typ jest wywnioskowany lub jawny. Typ zwracany zadeklarowany przy użyciu słowa kluczowego var nie jest dozwolony.

Typ delegata wyrażenia lambda

  • CS9099: Ostrzeżenie: domyślna wartość parametru nie jest zgodna z typem delegata docelowego.

W przypadku deklarowania wartości domyślnej lub dodawania params modyfikatora za pomocą parametru wyrażenia lambda typ delegata nie jest jednym z Func typów lub Action . Zamiast tego jest to typ niestandardowy, który zawiera domyślną wartość parametru lub params modyfikator. Poniższy kod generuje ostrzeżenia, ponieważ przypisuje wyrażenie lambda, które ma domyślny parametr do Action typu:

Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };

Aby naprawić błąd, usuń parametr domyślny lub użyj niejawnie typizowanej zmiennej dla typu delegata:

Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };