Usuwanie błędów i ostrzeżeń generowanych na podstawie wyrażeń zabronionych w drzewach wyrażeń
W tym artykule opisano następujące błędy kompilatora:
- Metody częściowe CS0765 - z tylko deklaracją definiującą lub usuniętą metodami warunkowymi nie mogą być używane w drzewach wyrażeń.
- CS0831 - Drzewo wyrażeń może nie zawierać dostępu podstawowego.
- CS0832 - Drzewo wyrażeń może nie zawierać operatora przypisania
- CS0834 - Nie można przekonwertować wyrażenia lambda z treścią instrukcji na drzewo wyrażeń.
- CS0835 - Nie można przekonwertować lambda na drzewo wyrażeń, którego argument typu "type" nie jest typem delegata.
- CS0838 - Drzewo wyrażeń może nie zawierać inicjatora tablicy wielowymiarowej.
- CS0845 - Drzewo wyrażeń lambda może nie zawierać operatora łączenia z pustym lub domyślnym literałem po lewej stronie.
- CS0853 - Drzewo wyrażeń może nie zawierać nazwanej specyfikacji argumentu.
- CS0854 - Drzewo wyrażeń może nie zawierać wywołania ani wywołania używającego opcjonalnych argumentów.
- CS0855 - Drzewo wyrażeń może nie zawierać właściwości indeksowanej.
- CS1944 - Drzewo wyrażeń może nie zawierać niebezpiecznej operacji wskaźnika.
- CS1945 - Drzewo wyrażeń może nie zawierać anonimowego wyrażenia metody.
- CS1946 - Nie można przekonwertować anonimowego wyrażenia metody na drzewo wyrażeń.
- CS1951 - Drzewo wyrażeń lambda może nie zawierać parametru
ref
lubout
.in
- CS1952 - Drzewo wyrażeń lambda może nie zawierać metody z argumentami zmiennych.
- CS1963 - Drzewo wyrażeń może nie zawierać operacji dynamicznej.
- Wyrażenia lambda asynchronicznego CS1989 - nie mogą być konwertowane na drzewa wyrażeń.
- CS2037 - Drzewo wyrażeń lambda może nie zawierać wywołania COM z pominięciem argumentów.
- CS7053 - Drzewo wyrażeń może nie zawierać "feature".
- CS8072 - Drzewo wyrażeń lambda może nie zawierać operatora propagacji wartości null.
- CS8074 - Drzewo wyrażeń lambda może nie zawierać inicjatora słownika.
- CS8075 - Metoda rozszerzenia
Add
nie jest obsługiwana dla inicjatora kolekcji w wyrażeniu lambda. - CS8110 - Drzewo wyrażeń może nie zawierać odwołania do funkcji lokalnej.
- CS8122 - Drzewo wyrażeń może nie zawierać operatora dopasowania wzorca "
is
". - CS8143 - Drzewo wyrażeń może nie zawierać literału krotki.
- CS8144 - Drzewo wyrażeń może nie zawierać konwersji krotki.
- CS8153 - Drzewo wyrażeń lambda może nie zawierać wywołania metody, właściwości lub indeksatora zwracanego przez odwołanie.
- Wyrażenia lambda CS8155 - zwracające odwołanie nie mogą być konwertowane na drzewa wyrażeń.
- CS8188 - Drzewo wyrażeń może nie zawierać wyrażenia-throw.
- CS8198 - Drzewo wyrażeń może nie zawierać deklaracji zmiennej argumentu out.
- CS8207 - Drzewo wyrażeń może nie zawierać odrzucenia.
- CS8382 - Drzewo wyrażeń może nie zawierać krotki
==
ani!=
operatora. - CS8514 - Drzewo wyrażeń może nie zawierać wyrażenia przełącznika.
- Drzewo wyrażeń CS8640 - nie może zawierać wartości struktury ref lub typu ograniczonego.
- CS8642 - Drzewo wyrażeń może nie zawierać przypisania łączenia wartości null.
- CS8790 - Drzewo wyrażeń może nie zawierać dostępu do wzorca System.Index ani System.Range indeksatora.
- CS8791 - Drzewo wyrażeń może nie zawierać wyrażenia indeksu od końca ('
^
'). - CS8792 - Drzewo wyrażeń może nie zawierać wyrażenia zakresu ('
..
'). - Cs8810 - '
&
' w grupach metod nie można używać w drzewach wyrażeń. - CS8849 - Drzewo wyrażeń może nie zawierać
with
-expression. - CS8927 - Drzewo wyrażeń może nie zawierać dostępu do statycznego elementu członkowskiego interfejsu wirtualnego lub abstrakcyjnego.
- CS8952 - Drzewo wyrażeń może nie zawierać interpolowanej konwersji procedury obsługi ciągów.
- CS8972 - Nie można przekonwertować wyrażenia lambda z atrybutami na drzewo wyrażeń.
- CS9170 - Drzewo wyrażeń może nie zawierać wbudowanego dostępu do tablicy ani konwersji.
- CS9175 - Drzewo wyrażeń może nie zawierać wyrażenia kolekcji.
- CS9226 - Drzewo wyrażeń może nie zawierać rozszerzonej formy parametrów kolekcji parametrów innych niż tablica.
Ograniczenia drzewa wyrażeń
Wszystkie błędy na powyższej liście wskazują, że użyto typu wyrażenia języka C#, który nie jest dozwolony w drzewie wyrażeń. W większości przypadków niedozwolone wyrażenia reprezentują składnię wprowadzoną po języku C# 3.0. Te wyrażenia są zabronione, ponieważ umożliwienie im utworzenia zmiany powodującej niezgodność we wszystkich bibliotekach, które analizują drzewa wyrażeń. Wszystkie biblioteki musiałyby zostać ulepszone, aby analizować nowe wyrażenia języka C#, jeśli nowsze konstrukcje były dozwolone.
Następujące wyrażenia są zabronione:
- Wywołania częściowych metod , które nie mają deklaracji implementacyjnej.
- Wywołania metod warunkowych, które zostały usunięte.
- Wywołania funkcji lokalnych.
async
Wyrażenia lambda nie są dozwolone.- Używanie
base
dostępu do bezpośredniego wywoływania metody wirtualnej zadeklarowanej w klasie bazowej. - operacje przypisania .
- wyrażenia lambdas nie są dozwolone.
- inicjatory tablic wielowymiarowych. Zamiast tego należy utworzyć i zainicjować tablicę wielowymiarową poza drzewem wyrażeń.
dynamic
operacje nie są dozwolone.- Wyrażenia dopasowania wzorca nie są dozwolone.
- Literały krotki i wiele operacji krotki, takich jak porównania równości, nie są dozwolone.
throw
wyrażenia nie są dozwolone.- odrzuć deklaracje (
_
). - Operatory indeksu i zakresu nie są dozwolone.
- Mutacja niedestrukcyjna przy użyciu
with
wyrażeń nie jest dozwolona. - Nie można zadeklarować ani uzyskać dostępu do tablic wbudowanych.
- Nie można uwzględnić wyrażeń kolekcji.
- Operatory propagacji wartości null i łączenia wartości null nie są dozwolone.
ref struct
typy, takie jak System.Span<T> i System.ReadOnlySpan<T> nie są dozwolone.in
parametry ,out
iref
, w tymout
deklaracje zmiennych, nie są dozwolone.ref
wartości zwracane nie są dozwolone.- Wywołania metod zwracanych przez
ref
nie są dozwolone. - Nie można uzyskać dostępu do statycznych abstrakcyjnych elementów członkowskich interfejsu.
- Tablice wbudowane.
- Modyfikator
params
jest dozwolony tylko w tablicach jednowymiarowych. Inne typy kolekcji nie są dozwolone.
Inne ograniczenia to:
- Atrybuty nie mogą być stosowane do wyrażenia lambda, jego parametrów ani zwracania.
- Wyrażenie lambda musi być konwertowane na typ pochodzący z System.Linq.Expressions.Expression którego parametr typu jest typem delegowanym.
- parametry nazwane i opcjonalne są ograniczone. Wyrażenie nie może wywołać metody określającej nazwane argumenty i nie może użyć wartości domyślnej opcjonalnego parametru.
- Inicjatory słowników nie są dozwolone. Żadna z nich nie jest metodami rozszerzenia
Add
. - Wyrażenie docelowe musi być wyrażeniem lambda. Stałe i zmienne nie są dozwolone, ale wyrażenie lambda zwracające stałą lub zmienną jest.
- Niebezpieczne operacje wskaźnika nie są dozwolone.
- Wywołania COM muszą zawierać
ref
argumenty; nie można dorozumiać. - Nieobsługiwane
__arglist
słowo kluczowe nie jest dozwolone.