Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Kilka błędów dotyczy deklarowania i używania wyrażeń lambda i metod anonimowych:
- CS0407: "metoda" ma nieprawidłowy typ zwracany.
- CS0428: Nie można przekonwertować grupy metod "Identifier" na typ niedelegowy "type". Czy zamierzasz wywołać metodę?
- CS0748: Niespójne użycie parametrów lambda; typy parametrów muszą być jawne lub wszystkie niejawne.
- CS0815: Nie można przypisać wyrażenia do niejawnie typizowanej zmiennej.
- CS0828: Nie można przypisać wyrażenia do właściwości typu anonimowego.
- CS0837: Pierwszy operand operatora "is" lub "as" może nie być wyrażeniem lambda, metodą anonimową lub grupą metod.
- CS1065: Wartości domyślne nie są prawidłowe w tym kontekście.
- CS1621: Instrukcja yield nie może być używana wewnątrz metody anonimowej ani wyrażenia lambda.
-
CS1628: Nie można użyć
inrefparametru anioutw 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.
- CS1643: Nie wszystkie ścieżki kodu zwracają wartość w anonimowej metodzie typu "type".
- CS1660: Nie można przekonwertować wyrażenia lambda na typ "type", ponieważ nie jest to typ delegata.
- CS1661: Nie można przekonwertować bloku metody anonimowej na typ "type", ponieważ typy parametrów nie są zgodne z typami parametrów delegata.
- CS1662: Nie można przekonwertować bloku metody anonimowej na zamierzony typ delegata, ponieważ niektóre typy zwracane w bloku nie są niejawnie konwertowane na typ zwracany delegata.
- 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'.
- CS1676: Parametr "number" musi być zadeklarowany za pomocą słowa kluczowego "keyword".
- CS1677: Parametr "number" nie powinien być zadeklarowany za pomocą słowa kluczowego "keyword".
- CS1678: Parametr "number" jest zadeklarowany jako typ "type1", ale powinien mieć wartość "type2".
- CS1686: Zmienna lokalna lub jej składowe nie mogą mieć adresu i być używane wewnątrz metody anonimowej lub wyrażenia lambda.
- CS1688: Nie można przekonwertować bloku metody anonimowej bez listy parametrów na typ delegata "delegate", ponieważ ma co najmniej jeden parametr wyjściowy.
- CS1706: Wyrażenie nie może zawierać metod anonimowych ani wyrażeń lambda.
- CS1731: Nie można przekonwertować wyrażenia na delegata, ponieważ niektóre typy zwracane w bloku nie są niejawnie konwertowane na typ zwracany delegata.
- CS1732: Oczekiwany parametr.
- CS1764: Nie można użyć stałego lokalnego wewnątrz metody anonimowej, wyrażenia lambda lub wyrażenia zapytania.
- 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.
- CS8820: Statyczna funkcja anonimowa nie może zawierać odwołania do zmiennej.
- CS8821: Statyczna funkcja anonimowa nie może zawierać odwołania do "this" lub "base".
- CS8916: Atrybuty w wyrażeniach lambda wymagają listy parametrów nawiasów.
- CS8917: Nie można wywnioskować typu delegata.
- CS8934: Nie można przekonwertować metody anonimowej na typ "type", ponieważ zwracany typ nie jest zgodny z typem zwracanego delegata.
-
CS8975: Słowo kluczowe kontekstowe
varnie może być używane jako jawny typ zwracany lambda. - CS9098: Niejawnie typowany parametr lambda '...' nie może mieć wartości domyślnej.
Ponadto kilka ostrzeżeń dotyczy deklarowania i używania wyrażeń lambda:
- CS0467: Niejednoznaczność między metodą "method" i non-method "non-method". Używanie grupy metod.
- CS1911: Dostęp do elementu członkowskiego za pomocą słowa kluczowego "base" z metody anonimowej, wyrażenia lambda, wyrażenia zapytania lub iteratora powoduje kod, który nie może być zweryfikowany.
- CS8971: InterpolatedStringHandlerArgument nie ma wpływu w przypadku zastosowania do parametrów lambda i zostanie zignorowany w lokacji wywołania.
- CS8974: Konwertowanie grupy metod "method" na typ niedelegujący "type". Czy zamierzasz wywołać metodę?
- 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
-
CS0837: Pierwszy operand
isoperatora lubasmoże nie być wyrażeniem lambda, metodą anonimową lub grupą metod. -
CS1621: Instrukcja
yieldnie może być używana wewnątrz metody anonimowej ani wyrażenia lambda. -
CS1628: Nie można użyć
inparametru ,refluboutw 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
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.
- CS1706: Wyrażenie nie może zawierać metod anonimowych ani wyrażeń lambda.
- CS1764: Nie można użyć lokalnej zmiennej stałej wewnątrz metody anonimowej, wyrażenia lambda lub wyrażenia zapytania.
- CS1911: Ostrzeżenie: dostęp do członka za pomocą słowa kluczowego "base" z metody anonimowej, wyrażenia lambda, wyrażenia zapytania lub iteratora powoduje, że kod jest nieweryfikowalny.
- CS8175: Nie można użyć zmiennej ref w metodzie anonimowej, wyrażeniu lambda lub wyrażeniu zapytania.
- CS8820: Statyczna funkcja anonimowa nie może zawierać odwołania do zmiennej.
- CS8821: Statyczna funkcja anonimowa nie może zawierać odwołania do "this" lub "base".
- CS8971: Ostrzeżenie: InterpolatedStringHandlerArgument nie ma wpływu w przypadku zastosowania do parametrów lambda i zostanie zignorowane w miejscu wywołania.
- CS9236: Informational: Kompilowanie wymaga powiązania wyrażenia lambda co najmniej określoną liczbę razy. Rozważ zadeklarowanie wyrażenia lambda z jawnym określeniem typów parametrów lub, jeśli wywołanie metody zawierającej jest typem ogólnym, rozważ użycie jawnych argumentów typu.
Kompilator zabrania niektórych konstrukcji języka C# wewnątrz wyrażeń lambda i metod anonimowych. Te ograniczenia istnieją, ponieważ kompilator przekształca metody lambda i anonimowe w delegowane wywołania lub drzewa wyrażeń, a niektóre konstrukcje nie mogą być reprezentowane w tych formularzach. Aby uzyskać więcej informacji, zobacz sekcję anonimowe wyrażenia funkcji specyfikacji języka C#.
Te błędy można naprawić, korzystając z następujących wskazówek:
- Przenieś dowolną instrukcję
yield returnlubyield breakpoza treść lambda do otaczającej metody iteratora, lub przekonwertuj lambdę na funkcję lokalną, która obsługuje instrukcjeyield(CS1621). - Unikaj odwoływania się do parametrów
in,ref, luboutz otaczającej metody wewnątrz ciała lambda. Gdy lambda przechwytuje te parametry jako część zamknięcia, nie można zachować semantyki odniesień parametrów podobnych doref. Skopiuj wartość do zmiennej lokalnej i użyj tej zmiennej lokalnej lub przekonwertuj lambda na funkcję lokalną (CS1628). - Usuń każdą instrukcję `
break`, `goto` lub `continue`, która przenosi kontrolę z ciała lambda. Instrukcje przepływu sterowania muszą kierować się do etykiet lub pętli w tym samym ciele lambda (CS1632). - W typie
structunikaj odwoływania się do elementów członkowskich wystąpienia wewnątrzthiswyrażenia lambda, metody anonimowej lub wyrażenia zapytania. Ponieważ kompilator przechwytujethiswedług wartości w elemeciestruct, mutacje wewnątrz lambdy nie wpływają na oryginalne wystąpienie. Wyodrębnij wymagane wartości składowych do zmiennych lokalnych przed lambdą lub przekonwertuj na funkcję lokalną, która może uzyskiwać bezpośredni dostęp dothis(CS1673). - Nie należy brać adresu zmiennej lokalnej, którą lambda również przechwytuje. Kompilator przenosi przechwycone zmienne do obiektu zamknięcia przydzielonego na stercie, co sprawia, że ich adres staje się niestabilny. Oddziel logikę przyjmowania adresów od lambdy lub zamiast tego użyj funkcji lokalnej (CS1686).
- Przenieś wyrażenie lambda lub metodę anonimową z wyrażenia zawierającego, które go zabrania. Niektóre wyrażenia, takie jak konstruktory atrybutów, nie obsługują wyrażeń lambda ani metod anonimowych jako argumentów (CS1706).
- Nie używaj zmiennej
fixedlokalnej wewnątrz treści lambda. Gwarancja przypinania instrukcjifixedma zastosowanie tylko do otaczającego zakresu, a nie do zamknięcia generowanego przez kompilator (CS1764). - Nie używaj zmiennej lokalnej
refwewnątrz funkcji lambda. Podobnie jakrefparametry,refzmienne lokalne nie mogą być przechwytywane w funkcji domknięcia, którą kompilator generuje dla wyrażenia lambda. Przypisz wartość do zmiennej innej niżreflokalna lub przekonwertuj lambdę na funkcję lokalną (CS8175). - Nie używaj wyrażenia lambda, metody anonimowej ani grupy metod jako pierwszego operandu
isoperatora oras. Te konstrukcje nie mają typu, który można przetestować w czasie wykonywania. Najpierw przypisz wyrażenie do zmiennej, a następnie przetestuj zmienną (CS0837). -
staticUsuń modyfikator z lambda lub usuń odwołanie do przechwyconej zmiennej. Lambdastaticzdecydowanie zabrania przechwytywania zmiennych lokalnych, parametrów, aby uniknąć niezamierzonych przydziałów zamknięcia. Jeśli musisz odwołać się do zmiennych zewnętrznych, usuństaticmodyfikator. Jeśli chcesz zachować minimalną alokację sterty, przekaż wartości jako parametry do lambda (CS8820, CS8821). - Usuń element InterpolatedStringHandlerArgumentAttribute z parametru lambda lub przenieś logikę do metody, w której atrybut jest honorowany. Kompilator ignoruje ten atrybut dla parametrów lambda, ponieważ wywołania lambda nie używają tej samej procedury obsługi ciągów interpolowanych obniżających się jako zwykłe wywołania metod (CS8971).
- Unikaj wywoływania wirtualnego członka za pomocą słowa kluczowego
basewewnątrz metody lambda lub anonimowej. Kompilator generuje wywołanie niewirtualne za pomocą metody pomocniczej, która generuje nieweryfikowalny kod. Rozważ wyodrębnieniebasewywołania do oddzielnej metody i wywołanie tej metody z poziomu lambdy (CS1911). - Zmniejsz złożoność przeciążonych wywołań metod, które akceptują wyrażenia lambda, lub dodaj jawne informacje o typie. Gdy kompilator musi wielokrotnie powiązać wyrażenie lambda w celu rozwiązania przeciążeń, emituje tę diagnostykę informacyjną. Deklarowanie lambda z jawnymi typami parametrów lub podawanie jawnych argumentów typu w wywołaniu metody ogólnej zmniejsza liczbę przebiegów powiązań, które kompilator musi wykonać (CS9236).
Parametry wyrażenia lambda i zwracane wartości
- CS0748: Niespójne użycie parametrów lambda; typy parametrów muszą być jawne lub wszystkie niejawne.
- CS1065: Wartości domyślne nie są prawidłowe w tym kontekście.
- CS1643: Nie wszystkie ścieżki kodu zwracają wartość w anonimowej metodzie typu "type".
- CS1661: Nie można przekonwertować bloku metody anonimowej na typ "type", ponieważ typy parametrów nie są zgodne z typami parametrów delegata.
- CS1662: Nie można przekonwertować bloku metody anonimowej na zamierzony typ delegata, ponieważ niektóre typy zwracane w bloku nie są niejawnie konwertowane na typ zwracany delegata.
- CS1676: Parametr 'number' musi być zadeklarowany przy użyciu słowa kluczowego 'keyword'.
- CS1677: Parametr "number" nie powinien być zadeklarowany za pomocą słowa kluczowego "słowo kluczowe".
- CS1678: Parametr "number" jest zadeklarowany jako typ "type1", ale powinien mieć wartość "type2".
- CS1688: Nie można przekonwertować bloku metody anonimowej bez listy parametrów na typ delegata "delegate", ponieważ ma co najmniej jeden parametr wyjściowy.
- CS1731: Nie można przekonwertować wyrażenia na delegata, ponieważ niektóre typy zwracane w bloku nie mogą być niejawnie przekonwertowane na typ zwracany delegata.
- CS1732: Oczekiwany parametr.
- 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.
- CS8934: Nie można przekonwertować metody anonimowej na typ "type", ponieważ zwracany typ nie jest zgodny z typem zwracanego delegata.
- 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.
Te błędy wskazują problem z parametrem wyrażenia lambda lub deklaracją zwracanego typu. Pełne reguły dotyczące parametrów lambda i typów zwracanych można znaleźć w sekcji wyrażenia lambda, metody anonimowe i sekcję wyrażeń funkcji anonimowych specyfikacji języka C#.
Uwaga / Notatka
Cs1731 i CS1732 nie są już produkowane przez bieżącą wersję kompilatora języka C# (Roslyn). Mogą one pojawić się, jeśli używasz starszej wersji kompilatora.
Te błędy można naprawić, korzystając z następujących wskazówek:
- Upewnij się, że wszystkie parametry w wyrażeniu lambda używają tego samego stylu wpisywania. Gdy lambda ma wiele parametrów, każdy parametr musi być jawnie wpisany lub niejawnie wpisany — nie można mieszać dwóch stylów na tej samej liście parametrów (CS0748).
- Dodaj jawne typy do dowolnego parametru lambda, który ma wartość domyślną. Kompilator wymaga jawnych typów parametrów z wartościami domyślnymi, ponieważ musi wygenerować niestandardowy typ delegata, który koduje wartość domyślną. Niejawnie wpisane parametry nie zapewniają wystarczającej ilości informacji dla kompilatora, aby skonstruować ten typ delegata (CS1065, CS9098).
- Usuń domyślne wartości parametrów z metod anonimowych zadeklarowanych przy użyciu
delegateoperatora . Domyślne wartości parametrów są obsługiwane tylko w wyrażeniach lambda, a nie w metodach anonimowych. Przekonwertuj metodę anonimową na wyrażenie lambda, jeśli potrzebujesz wartości domyślnych (CS1065). - Dopasowuje typy parametrów,
ref/out/inmodyfikatory i liczbę parametrów metody lambda lub anonimowej do docelowego typu delegata. Kompilator wykonuje dokładne dopasowanie podpisów parametrów podczas konwertowania funkcji anonimowej na delegata: każdy parametr musi mieć poprawny typ, a dowolnyrefmodyfikator ,outlubinmusi być obecny dokładnie wtedy, gdy delegat oczekuje go (CS1661, CS1676, CS16777, CS1678). - Dodaj listę parametrów do metody anonimowej, gdy docelowy typ delegata ma
outparametry. Metoda anonimowa zadeklarowana bez listy parametrów (przy użyciudelegate { }składni) może być zgodna z większością typów delegatów, ale kompilator nie może niejawnie syntetyzować wymaganychoutparametrów. Zadeklaruj parametry jawnie, aby pasować do podpisu delegata (CS1688). - Upewnij się, że wszystkie ścieżki kodu w metodzie lambda lub anonimowej zwracają wartość, gdy docelowy typ delegata ma typ zwracany różny od void. Każda ścieżka w kodzie musi wygenerować wartość zwrotną, która jest niejawnie konwertowana na typ zwracany delegata (CS1643, CS1662, CS1731, CS8934).
- Usuń każdą instrukcję
returnzawierającą wartość z metody lambda lub anonimowej metody, która jest przypisana do typu delegata zwracającegovoid, takiego jakAction. Ponieważ zwracany typ delegata tovoid, treść nie może zwrócić wartości (CS8030). - Dołącz listę parametrów w nawiasach, gdy atrybuty są stosowane do dowolnego parametru lambda. Kompilator potrzebuje formy nawiasowej, aby rozróżnić składnię atrybutów od innych wyrażeń. Na przykład zapisz
([MyAttribute] int x) => xzamiast[MyAttribute] x => x(CS8916). - Użyj określonej nazwy typu zamiast
varjako jawnego zwracanego typu wyrażenia lambda. Słowo kluczowevarjest zarezerwowane dla niejawnie wpisanych zmiennych lokalnych i nie może być używane jako adnotacja typu lambda zwracanego. Określ rzeczywisty typ zwracany lub pomiń typ zwracany i pozwól kompilatorowi wywnioskować go (CS8975). - Napraw listę parametrów, aby kompilator mógł rozpoznać ją jako prawidłową deklarację parametru. Ten błąd wskazuje źle sformułowaną listę parametrów, na której kompilator oczekiwał identyfikatora parametru, ale znalazł coś innego (CS1732).
Typ delegata wyrażenia lambda
- CS0407: "metoda" ma nieprawidłowy typ zwracany.
- CS0428: Nie można przekonwertować grupy metod "Identifier" na typ niedelegowy "type". Czy zamierzasz wywołać metodę?
- CS0467: Ostrzeżenie: Niejednoznaczność między funkcją 'method' a nie-funkcją 'non-method'. Użycie grupy funkcji.
- CS0815: Nie można przypisać wyrażenia do niejawnie typizowanej zmiennej.
- CS0828: Nie można przypisać wyrażenia do właściwości typu anonimowego.
- CS1660: Nie można przekonwertować wyrażenia lambda na typ "type", ponieważ nie jest to typ delegata.
- CS8917: Nie można wywnioskować typu delegata.
- CS8974: Ostrzeżenie: Konwertowanie grupy metod "method" na typ niedelegujący "type". Czy zamierzasz wywołać metodę?
- CS9099: Ostrzeżenie: domyślna wartość parametru nie jest zgodna z typem delegata docelowego.
- CS9100: Ostrzeżenie: Parametr ma modyfikator 'params' w wyrażeniu lambda, ale nie w docelowym typie delegata.
Te błędy wskazują na problem z typem delegata , który kompilator wywnioskuje lub oczekuje dla wyrażenia lambda, metody anonimowej lub grupy metod. Aby zapoznać się z pełnymi regułami konwersji delegatów, zobacz sekcję wyrażenia lambda, metody anonimowe i anonimowe wyrażenia funkcji specyfikacji języka C#.
Uwaga / Notatka
Bieżąca wersja kompilatora języka C# (Roslyn) nie generuje CS0467. Ten błąd może wystąpić, jeśli używasz starszej wersji kompilatora.
Te błędy można naprawić, korzystając z następujących wskazówek:
- Upewnij się, że typ docelowy przypisania lub konwersji jest typem delegata lub System.Linq.Expressions.Expression. Nie można przypisać wyrażenia lambda lub metody anonimowej do typu niedelegowanego, takiego jak
objectlub interfejsu. Zmień typ zmiennej na zgodny typ delegata, taki jakFunc<>lubAction<>, lub użyjvar, aby kompilator wywnioskować typ delegata (CS1660). - Podaj wystarczający kontekst dla kompilatora, aby określić pojedynczy typ delegata dla wyrażenia lambda. Po przypisaniu do
var, kompilator potrzebuje jednoznacznego zwracanego typu i listy parametrów. Po przypisaniu do właściwości typu anonimowego kompilator nie może w ogóle wywnioskować typu delegata. Przypisz lambda do zmiennej z jawnym typem delegata, a następnie użyj tej zmiennej w inicjatorze typu anonimowego (CS0815, CS0828, CS8917). - Dopasuj typ zwracany grupy metod do typu zwracania zadeklarowanego dla delegata. Konwersja grupy metod wymaga, aby typ zwracany przez metodę był konwertowalny na tożsamość lub niejawnie konwertowalny na typ zwracany przez delegata. Zmień typ zwracany metody lub zmień typ delegata tak, aby był zgodny (CS0407).
- Wywołaj metodę zamiast przypisywać grupę metod, gdy typ docelowy nie jest pełnomocnikiem. Jeśli typ docelowy to
string,intlub inny typ, który nie jest delegowany, prawdopodobnie zamierzasz wywołać metodę i przypisać jej wynik. Dodaj nawiasy i argumenty, aby wywołać metodę (CS0428, CS8974). - Rozwiąż niejednoznaczność między metodą a członkiem, który nie jest metodą, ale ma tę samą nazwę. Zmień nazwę jednego z elementów członkowskich powodujących konflikt lub użyj w pełni kwalifikowanego odwołania, aby usunąć niejednoznaczność (CS0467).
- Usuń domyślną wartość parametru lub
paramsmodyfikator z wyrażenia lambda, gdy docelowy typ delegata jest standardowymFunc<>lubAction<>typem. Wartości domyślne iparamsmodyfikatory powodują, że kompilator generuje niestandardowy typ delegata, który nie jest zgodnyFunc<>lubAction<>. Użyjvarpolecenia , aby umożliwić kompilatorowi syntetyzowanie poprawnego typu delegata lub usunięcie wartości domyślnej lubparamsmodyfikatora, aby lambda odpowiadała zadeklarowanemu typowi delegata (CS9099, CS9100).