Udostępnij za pośrednictwem


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 reflub out . 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:

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.