Résoudre les erreurs et les avertissements générés à partir d’expressions interdites dans les arborescences d’expressions
Cet article traite des erreurs suivantes du compilateur :
- CS0765 - Les méthodes partielles avec uniquement une déclaration de définition ou des méthodes conditionnelles supprimées ne peuvent pas être utilisées dans les arborescences d’expressions.
- CS0831 - Une arborescence d’expression ne doit pas contenir d’accès de base.
- CS0832 - Une arborescence d’expression ne doit pas contenir d’opérateur d’assignation
- CS0834 - Une expression lambda avec un corps d’instruction ne peut pas être convertie en arborescence d’expression.
- CS0835 - Impossible de convertir une expression lambda en arborescence d’expression dont l’argument de type 'type' n’est pas un type délégué.
- CS0838 - Une arborescence d’expression ne doit pas contenir d’initialiseur de tableau multidimensionnel.
- CS0845 - Une arborescence d’expression lambda ne doit pas contenir d’opérateur de coalescence avec un littéral nul ou un littéral par défaut dans la partie de gauche.
- CS0853 - Une arborescence d’expression ne doit pas contenir de spécification d’argument nommé.
- CS0854 - Une arborescence d’expression ne doit pas contenir d’appel qui utilise des arguments facultatifs.
- CS0855 - Une arborescence d’expression ne doit pas contenir de propriété indexée.
- CS1944 - Une arborescence d’expression ne doit pas contenir d’opération de pointeur unsafe.
- CS1945 - Une arborescence d’expression ne doit pas contenir d’expression de méthode anonyme.
- CS1946 - Une expression de méthode anonyme ne peut pas être convertie en arborescence d’expression.
- CS1951 - Une arborescence d’expression lambda ne doit pas contenir de paramètre
ref
,in
ouout
. - CS1952 - Une arborescence d’expression lambda ne doit pas contenir de méthode avec des arguments variables.
- CS1963 - Une arborescence d’expression ne doit pas contenir d’opération dynamique.
- CS1989 - Les expressions lambda asynchrones ne peuvent pas être converties en arborescences d’expressions.
- CS2037 - Une arborescence d’expression lambda ne doit pas contenir d’appel COM avec ref omis pour les arguments.
- CS7053 - Une arborescence d’expression ne doit pas contenir « fonctionnalité ».
- CS8072 - Une arborescence d’expression lambda ne doit pas contenir d’opérateur de propagation de valeur nulle.
- CS8074 - Une arborescence d’expression lambda ne doit pas contenir d’initialiseur de dictionnaire.
- CS8075 - Une méthode d’extension
Add
n’est pas prise en charge pour un initialiseur de collection dans une expression lambda. - CS8110 - Une arborescence d’expression ne doit pas contenir de référence à une fonction locale.
- CS8122 - Une arborescence d’expression ne doit pas contenir l’opérateur de critères spéciaux «
is
». - CS8143 - Une arborescence d’expression ne doit pas contenir de littéral de tuple.
- CS8144 - Une arborescence d’expression ne doit pas contenir de conversion de tuple.
- CS8153 - Une arborescence d’expression lambda ne doit pas contenir d’appel à une méthode, une propriété ou un indexeur qui effectue un retour par référence.
- CS8155 - Les expressions lambda qui effectuent un retour par référence ne peuvent pas être converties en arborescences d’expressions.
- CS8188 - Une arborescence d’expression ne doit pas contenir d’expression throw.
- CS8198 - Une arborescence d’expression ne doit pas contenir de déclaration de variable d’argument de sortie.
- CS8207 - Une arborescence d’expression ne doit pas contenir de discards.
- CS8382 - Une arborescence d’expression ne doit pas contenir d’opérateur de comparaison de tuple
==
ou!=
. - CS8514 - Une arborescence d’expression ne doit pas contenir d’expression switch.
- CS8640 - L’arborescence d’expression ne peut pas contenir de valeur de type ref struct ou de type restreint.
- CS8642 - Une arborescence d’expression ne doit pas contenir d’assignation de coalescence nulle.
- CS8790 - Une arborescence d’expression ne doit pas contenir d’accès aux indexeurs via System.Index ou System.Range.
- CS8791 - Une arborescence d’expression ne doit pas contenir d’expression utilisant l’opérateur («
^
») pour désigner un index dont les éléments sont comptés à partir de la fin. - CS8792 - Une arborescence d’expression ne doit pas contenir d’expression de plage («
..
»). - CS8810 - «
&
» des groupes de méthodes ne peut pas être utilisé dans les arborescences d’expressions. - CS8849 - Une arborescence d’expression ne doit pas contenir d’expression
with
. - CS8927 - Une arborescence d’expression ne doit pas contenir d’accès à un membre statique, un membre virtuel ou un membre d’interface abstrait.
- CS8952 - Une arborescence d’expression ne doit pas contenir de conversion de gestionnaire de chaînes interpolées.
- CS8972 - Une expression lambda avec des attributs ne peut pas être convertie en arborescence d’expression.
- CS9170 - Une arborescence d’expression ne doit pas contenir d’accès ou de conversion de tableau inline.
- CS9175 - Une arborescence d’expression ne doit pas contenir d’expression de collection.
- CS9226 - Une arborescence d’expressions peut ne pas contenir une forme développée de paramètre de collection params qui n’est pas un tableau.
Restrictions relatives à l’arborescence d’expression
Toutes les erreurs de la liste précédente indiquent que vous avez utilisé un type d’expression C#, qui n’est pas autorisé dans une arborescence d’expression. Dans la plupart des cas, les expressions interdites représentent une syntaxe introduite après C# 3.0. Ces expressions sont interdites, car leur autorisation entraînerait un changement cassant dans toutes les bibliothèques qui analysent les arborescences d’expressions. Toutes les bibliothèques doivent être améliorées pour analyser les nouvelles expressions C#, si des constructions plus récentes sont autorisées.
Les expressions suivantes sont interdites :
- Appels de méthodes partielles qui n’ont pas de déclaration d’implémentation.
- Appels de méthodes conditionnelles qui ont été supprimées.
- Appels de fonctions locales.
- Les expressions lambda
async
ne sont pas autorisées. - Utilisation de l’accès
base
pour appeler directement une méthode virtuelle déclarée dans une classe de base. - Opérations d’assignation.
- Les expressions lambda représentant un bloc d’instructions ne sont pas autorisées.
- Initialiseurs de tableaux multidimensionnels. À la place, vous devez créer et initialiser un tableau multidimensionnel en dehors de l’arborescence d’expression.
- Les opérations
dynamic
ne sont pas autorisées. - Les expressions utilisant des critères spéciaux ne sont pas autorisées.
- Les littéraux de tuple et de nombreuses opérations relatives aux tuples, par exemple les comparaisons d’égalité, ne sont pas autorisées.
- Les expressions
throw
ne sont pas autorisées. - Les déclarations de discards (
_
). - Les opérateurs d’index et de plage ne sont pas autorisés.
- Les mutations non destructrices qui utilisent des expressions
with
ne sont pas autorisées. - Vous ne pouvez pas déclarer les tableaux inline, ni y accéder.
- Vous ne pouvez pas inclure d’expressions de collection.
- Les opérateurs de propagation de valeurs nulles et de coalescence de valeurs nulles ne sont pas autorisés.
- Les types
ref struct
, par exemple System.Span<T> et System.ReadOnlySpan<T>, ne sont pas autorisés. - Les paramètres
in
,out
etref
, notamment les déclarations de variableout
, ne sont pas autorisés. - Les retours avec
ref
ne sont pas autorisés. - Les appels de méthodes qui effectuent un retour par
ref
ne sont pas autorisés. - Les membres d’interface abstraits statiques sont inaccessibles.
- Tableaux inlined.
- Le modificateur
params
est autorisé seulement sur des tableaux unidimensionnels. Les autres types de collection ne sont pas autorisés.
Autres restrictions :
- Les attributs ne peuvent pas être appliqués à l’expression lambda, à ses paramètres ou à son retour.
- L’expression lambda doit être convertible en un type dérivé de System.Linq.Expressions.Expression dont le paramètre de type est un type délégué.
- Les paramètres nommés et facultatifs sont restreints. L’expression ne peut pas appeler de méthode spécifiant des arguments nommés, et elle ne peut pas utiliser la valeur par défaut d’un paramètre facultatif.
- Les initialiseurs de dictionnaire ne sont pas autorisés. Les méthodes d’extension
Add
ne le sont pas non plus. - L’expression cible doit être une expression lambda. Les constantes et les variables ne sont pas autorisées. En revanche, les expressions lambda qui retournent des constantes ou des variables le sont.
- Les opérations de pointeur unsafe ne sont pas autorisées.
- Les appels COM doivent inclure
ref
sur les arguments. Cela ne peut pas être implicite. - Le mot clé
__arglist
, non pris en charge, n’est pas autorisé.