Udostępnij za pomocą


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: Instrukcja sterująca nie może wyjść poza treść anonimowej metody lub wyrażenia lambda.
  • CS1673: Metody anonimowe, wyrażenia lambda i wyrażenia zapytań wewnątrz struktur nie mogą uzyskiwać dostępu do składników 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 anonimowa przekonwertowana na delegata zwracającego void nie może zwrócić wartości.
  • CS8175: Nie można użyć lokalnej zmiennej 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 kontekstowe var nie może być używane jako jawny typ zwracany lambda.
  • CS9098: Niejawnie typowany parametr lambda '...' 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.

Kompilator generuje również następujący komunikat informacyjny :

  • CS9236: Kompilowanie wymaga powiązania wyrażenia lambda co najmniej określoną liczbę razy. Rozważ zadeklarowanie wyrażenia lambda z użyciem jawnych typów parametrów lub, jeśli wywołanie zawierającej metody jest generyczne, użycie jawnych argumentów typu.

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 członków this wystą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ć zmiennej 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 in, ref, lub out parametr.
  • 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ługujące ciągi interpolowane są ignorowane, gdy są stosowane do parametru lambda. Jeśli go używasz, zostanie wyświetlone następujące ostrzeżenie:

  • CS8971: InterpolatedStringHandlerArgument nie ma wpływu, gdy jest stosowany do parametrów lambda i zostanie zignorowany w miejscu wywołania.

Niektóre wyrażenia powodują, że kompilator emituje następujące ostrzeżenie informacyjne:

  • CS9236: Kompilowanie wymaga powiązania wyrażenia lambda co najmniej określoną liczbę razy. Rozważ zadeklarowanie wyrażenia lambda z jawnymi typami parametrów lub, jeśli wywołanie metody, która je zawiera, jest ogólne, rozważ użycie jawnych argumentów typu.

Złożoność wyrażeń lambda i sposób wywoływania innych wyrażeń lambda ma negatywny wpływ na wydajność kompilatora. Przyczyną jest to, że kompilator musi wnioskować typy parametrów i argumentów za pomocą wyrażeń lambda, a potencjalne typy zajmują trochę czasu.

Parametry wyrażenia lambda i zwracane wartości

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 typowany parametr lambda '...' nie może mieć wartości domyślnej.
  • CS8030: Funkcja anonimowa przekonwertowana na delegata zwracającego 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 albo wywnioskowany, albo określony jawnie. 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.

Kiedy deklarujesz wartość domyślną lub dodajesz modyfikator params z parametrem wyrażenia lambda, typ delegata nie jest jednym z typów Func lub Action. Zamiast tego jest to typ niestandardowy, który zawiera wartość domyślną parametru lub modyfikator params. 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) => { };