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ć
in
ref
parametru aniout
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ć
in
parametru ,ref
lubout
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
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ć 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
lubyield break
)- Wywoływanie metody, która ma
in
parametr ,ref
lubout
ref
zmienne lokalnebreak
,goto
, icontinue
instrukcjethis
dostęp, gdythis
jest typemstruct
- 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 jakAction
. - 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) => { };