Risolvere gli errori e gli avvisi generati dalle espressioni vietate negli alberi delle espressioni
Questo articolo illustra gli errori del compilatore seguenti:
- CS0765 - I metodi parziali con solo una dichiarazione di definizione o metodi condizionali rimossi non possono essere usati negli alberi delle espressioni.
- CS0831 - Un albero delle espressioni potrebbe non contenere un accesso di base.
- CS0832 - Un albero delle espressioni non può contenere un operatore di assegnazione
- CS0834 - Un'espressione lambda con un corpo dell'istruzione non può essere convertita in un albero delle espressioni.
- CS0835 - Impossibile convertire lambda in un albero delle espressioni il cui argomento tipo 'type' non è un tipo delegato.
- CS0838 - Un albero delle espressioni potrebbe non contenere un inizializzatore di matrice multidimensionale.
- CS0845 - Un'espressione lambda dell’albero delle espressioni potrebbe non contenere un operatore di coalescenza con un valore letterale null o predefinito a sinistra.
- CS0853 - Un albero delle espressioni potrebbe non contenere una specifica di argomento denominata.
- CS0854 - Un albero delle espressioni potrebbe non contenere una chiamata o un’invocazione che usa argomenti facoltativi.
- CS0855 - Un albero delle espressioni potrebbe non contenere una proprietà indicizzata.
- CS1944 - Un albero delle espressioni potrebbe non contenere un'operazione di puntatore non sicura.
- CS1945 - Un albero delle espressioni potrebbe non contenere un'espressione di metodo anonimo.
- CS1946 - Un'espressione di metodo anonimo non può essere convertita in un albero delle espressioni.
- CS1951 - Un'espressione lambda dell'albero delle espressioni potrebbe non contenere un parametro
ref
,in
oout
. - CS1952 - Un'espressione lambda dell'albero delle espressioni potrebbe non contenere un metodo con argomenti variabili.
- CS1963 - Un albero delle espressioni potrebbe non contenere un'operazione dinamica.
- CS1989 - Le espressioni lambda asincrone non possono essere convertite in alberi delle espressioni.
- CS2037 - Un'espressione lambda dell'albero delle espressioni potrebbe non contenere una chiamata COM con ref omesso sugli argomenti.
- CS7053 - Un albero delle espressioni potrebbe non contenere una "funzionalità".
- CS8072 - Un'espressione lambda dell'albero delle espressioni potrebbe non contenere un operatore di propagazione Null.
- CS8074 - Un'espressione lambda dell'albero delle espressioni potrebbe non contenere un inizializzatore di dizionario.
- CS8075 - Un metodo di estensione
Add
non è supportato per un inizializzatore di raccolta in un'espressione lambda. - CS8110 - Un albero delle espressioni potrebbe non contenere un riferimento a una funzione locale.
- CS8122 - Un albero delle espressioni potrebbe non contenere un operatore di corrispondenza dei criteri '
is
'. - CS8143 - Un albero delle espressioni potrebbe non contenere un valore letterale di tupla.
- CS8144 - Un albero delle espressioni potrebbe non contenere una conversione di tupla.
- CS8153 - Un'espressione lambda dell'albero delle espressioni potrebbe non contenere una chiamata a un metodo, una proprietà o un indicizzatore che restituisce per riferimento.
- CS8155 - Le espressioni lambda restituite dal riferimento non possono essere convertite in alberi delle espressioni.
- CS8188 - Un albero delle espressioni potrebbe non contenere un'espressione throw.
- CS8198 - Un albero delle espressioni potrebbe non contenere una dichiarazione di variabile di argomento out.
- CS8207 - Un albero delle espressioni potrebbe non contenere un'eccezione.
- CS8382 - Un albero delle espressioni potrebbe non contenere un
==
di tupla o un operatore!=
. - CS8514 - Un albero delle espressioni potrebbe non contenere un'espressione switch.
- CS8640 - Un albero delle espressioni non può contenere un valore di tipo ref struct o con restrizioni.
- CS8642 - Un albero delle espressioni potrebbe non contenere un'assegnazione di coalescenza null.
- CS8790 - Un albero delle espressioni potrebbe non contenere un System.Index di criteri o un accesso System.Range indicizzatore.
- CS8791 - Un albero delle espressioni non può contenere un'espressione di indice from-end ('
^
'). - CS8792 - Un albero delle espressioni potrebbe non contenere un'espressione di intervallo ('
..
'). - CS8810 - '
&
' nei gruppi di metodi non può essere usato negli alberi delle espressioni. - CS8849 - Un albero delle espressioni potrebbe non contenere un'espressione
with
. - CS8927 - Un albero delle espressioni potrebbe non contenere un accesso a un membro di interfaccia virtuale o astratta statico.
- CS8952 - Un albero delle espressioni potrebbe non contenere una conversione del gestore di stringhe interpolata.
- CS8972 - Un'espressione lambda con attributi non può essere convertita in un albero delle espressioni.
- CS9170 - Un albero delle espressioni potrebbe non contenere un accesso o una conversione di matrici inline.
- CS9175 - Un albero delle espressioni potrebbe non contenere un'espressione di raccolta.
- CS9226 - Un albero delle espressioni potrebbe non contenere una forma espansa di parametro di raccolta params non di matrice.
Restrizioni agli alberi delle espressioni
Tutti gli errori nell'elenco precedente indicano che è stato usato un tipo di espressione C# non consentito in un albero delle espressioni. Nella maggior parte dei casi, le espressioni non consentite rappresentano la sintassi introdotta dopo C# 3.0. Queste espressioni non sono consentite perché consentono di creare una modifica che causa un'interruzione in tutte le librerie che analizzano gli alberi delle espressioni. Tutte le librerie devono essere migliorate per analizzare le nuove espressioni C# se sono consentiti costrutti più recenti.
Le espressioni seguenti non sono consentite:
- Chiamate di metodi parziali che non dispongono di una dichiarazione di implementazione.
- Chiamate di metodi condizionali rimossi.
- Chiamate di funzioni locali.
- Le espressioni lambda
async
non sono consentite. - Uso dell'accesso
base
per chiamare direttamente un metodo virtuale dichiarato in una classe base. - operazioni di assegnazione.
- Le espressioni lambda delle istruzioni non sono consentite.
- Inizializzatori di matrice multidimensionali. È invece necessario creare e inizializzare una matrice multidimensionale all'esterno dell'albero delle espressioni.
- Le operazioni
dynamic
non sono consentite. - Le espressioni di ricerca di criteri non sono consentite.
- I valori letterali tuple e molte operazioni di tupla, ad esempio i confronti di uguaglianza, non sono consentiti.
- Le espressioni
throw
non sono consentite. - Dichiarazioni discard (
_
). - Gli operatori di indice e intervallo non sono consentiti.
- Non sono consentite mutazioni non distruttive tramite espressioni
with
. - Non è possibile dichiarare o accedere a matrici inline.
- Non è possibile includere espressioni di raccolta.
- Gli operatori null di propagazione e coalescenza null non sono consentiti.
- Tipi
ref struct
, ad esempio System.Span<T> e System.ReadOnlySpan<T> non sono consentiti. - I parametri
in
,out
eref
, incluse le dichiarazioni di variabileout
, non sono consentiti. - I valori
ref
restituiti non sono consentiti. - Le chiamate ai metodi restituiti da
ref
non sono consentite. - Non è possibile accedere ai membri dell'interfaccia astratta statica.
- Matrici inline.
- Il modificatore
params
è consentito solo su matrici unidimensionali. Altri tipi di raccolta non sono consentiti.
Altre restrizioni sono:
- Gli attributi non possono essere applicati all'espressione lambda, ai relativi parametri o restituiti.
- L'espressione lambda deve essere convertibile in un tipo derivato da System.Linq.Expressions.Expression il cui parametro di tipo è un tipo delegato.
- I parametri denominati e facoltativi sono limitati. L'espressione non può chiamare un metodo che specifica argomenti denominati e non può usare il valore predefinito di un parametro facoltativo.
- Gli inizializzatori di dizionario non sono consentiti. Non sono nemmeno metodi di estensione
Add
. - L'espressione di destinazione deve essere un'espressione lambda. Le costanti e le variabili non sono consentite, ma un'espressione lambda che restituisce una costante o una variabile sì.
- Le operazioni dei puntatori non sicure non sono consentite.
- Le chiamate COM devono includere
ref
sugli argomenti; non può essere implicito. - La parola chiave
__arglist
non supportata non è consentita.