Resolver errores y advertencias generados a partir de expresiones prohibidas en árboles de expresión
En este artículo se tratan los siguientes errores del compilador:
- CS0765 - En los árboles de expresión no se pueden usar métodos parciales con solo una declaración de definición ni métodos condicionales quitados.
- CS0831 - Un árbol de expresión no puede contener un acceso base.
- CS0832 - Un árbol de expresión no puede contener un operador de asignación
- CS0834 - Una expresión lambda con un cuerpo de instrucción no se puede convertir en un árbol de expresión.
- CS0835 - No se puede convertir una expresión lambda a un árbol de expresión cuyo argumento de tipo 'tipo' no sea un tipo delegado.
- CS0838 - Un árbol de expresión no puede contener un inicializador de matriz multidimensional.
- CS0845 - Un elemento lambda de árbol de expresión no puede contener un operador de incorporación con un literal predeterminado o nulo en la parte izquierda.
- CS0853 - Un árbol de expresión no puede contener una especificación de argumento con nombre.
- CS0854 - Un árbol de (la) expresión no puede contener una llamada o invocación que use argumentos opcionales.
- CS0855 - Un árbol de expresión no puede contener una propiedad indizada.
- CS1944 - Un árbol de expresión no puede contener una operación de puntero no segura.
- CS1945 - Un árbol de expresión no puede contener una expresión de método anónimo.
- CS1946 - Una expresión de método anónimo no se puede convertir en un árbol de expresión.
- CS1951 - Una expresión lambda de árboles de expresión no puede contener un parámetro
ref
,in
oout
. - CS1952 - Una expresión lambda de árboles de expresión no puede contener un método con argumentos variables.
- CS1963 - Un árbol de expresión no puede contener una operación dinámica.
- CS1989 - Las expresiones lambda asincrónicas no se pueden convertir en árboles de expresión.
- CS2037 - Una expresión lambda de árbol de expresión no puede contener una llamada COM con ref omitido en argumentos.
- CS7053 - Un árbol de expresiones no puede contener "feature".
- CS8072 - Una expresión lambda de árbol de expresión no puede contener un operador de propagación null.
- CS8074 - Una expresión lambda de árbol de expresión no puede contener un inicializador de diccionarios.
- CS8075 - No se admite un método
Add
de extensión para un inicializador de colección en un lambda de expresión. - CS8110 - Un árbol de expresión no puede contener una referencia a una función local.
- CS8122 - Un árbol de expresión no puede contener un operador de coincidencia de patrones "
is
". - CS8143 - Un árbol de expresión no puede contener un literal de tupla.
- CS8144 - Un árbol de expresión no puede contener una conversión de tupla.
- CS8153 - Un lambda de árbol de expresión no puede contener una llamada a un método, una propiedad o un indexador que devuelva datos por referencia.
- CS8155 - Las expresiones lambda que devuelven datos por referencia no se pueden convertir en árboles de expresión.
- CS8188 - Un árbol de expresión no puede contener una expresión throw.
- CS8198 - Un árbol de expresión no puede contener una declaración de variable de argumento out.
- CS8207 - Un árbol de expresión no puede contener un descarte.
- CS8382 - Un árbol de expresión no puede contener un operador de tupla
==
o!=
. - CS8514 - Un árbol de expresión no puede contener una expresión switch.
- CS8640 - Un árbol de expresión no puede contener un valor de estructura ref ni el tipo restringido.
- CS8642 - Un árbol de expresión no puede contener una asignación de fusión nula.
- CS8790 - Un árbol de expresiones no puede contener un patrón de acceso al indexador System.Index o System.Range.
- CS8791 - Un árbol de expresión no puede contener una expresión de índice del otro extremo ("
^
"). - CS8792 - Un árbol de expresión no puede contener una expresión de intervalo ("
..
"). - CS8810 - "
&
" en grupos de métodos no se puede usar en árboles de expresión. - CS8849 - Un árbol de expresión no puede contener una
with
-expresión. - CS8927 - Un árbol de (la) expresión no puede contener un acceso de miembro de interfaz abstracta o virtual estática.
- CS8952 - Un árbol de (la) expresión no puede contener una conversión de controlador de cadena interpolada.
- CS8972 - Una expresión lambda con atributos no se puede convertir en un árbol de expresión.
- CS9170 - Un árbol de expresión no puede contener un acceso o conversión de matriz insertada.
- CS9175 - Un árbol de expresiones no puede contener una expresión de colección.
- CS9226 - Un árbol de expresiones no puede contener una forma expandida de parámetros de colección de parámetros que no sean de matriz.
Restricciones de árbol de expresión
Todos los errores de la lista anterior indican que ha usado un tipo de expresión de C# que no está permitido en un árbol de expresión. En la mayoría de los casos, las expresiones prohibidas representan la sintaxis introducida después de C# 3.0. Estas expresiones están prohibidas porque les permitirían crear un cambio importante en todas las bibliotecas que analizan los árboles de expresión. Todas las bibliotecas tendrían que mejorarse para analizar las nuevas expresiones de C# si se permitieran nuevas construcciones.
Se prohíben las expresiones siguientes:
- Invocaciones de métodos parciales que no tienen una declaración de implementación.
- Invocaciones de métodos condicionales que se han quitado.
- Invocaciones de funciones locales.
- No se permiten expresiones lambda
async
. - Uso del acceso
base
para llamar directamente a un método virtual declarado en una clase base. - operaciones de asignación.
- no se permiten expresiones lambda de instrucción.
- inicializadores de matriz multidimensional. En su lugar, debe crear e inicializar una matriz multidimensional fuera del árbol de expresiones.
- No se permiten operaciones de
dynamic
. - No se permiten expresiones de coincidencia de patrones.
- No se permiten literales de tupla y muchas operaciones de tupla, como comparaciones de igualdad.
- No se permiten expresiones
throw
. - declaraciones de descarte (
_
). - No se permiten los operadores de índice e intervalo.
- No se permite la mutación no destructiva mediante expresiones
with
. - No puede declarar ni acceder a matrices insertadas.
- No se pueden incluir expresiones de colección.
- No se permiten los operadores de propagación null y de fusión null.
- Tipos de
ref struct
, como System.Span<T> y System.ReadOnlySpan<T> no se permiten. - No se permiten los parámetros
in
,out
yref
, incluidas las declaraciones de variablesout
. - No se permiten las devoluciones
ref
. - No se permiten llamadas a métodos devueltos por
ref
. - No se puede acceder a los miembros de la interfaz abstracta estática.
- Matrices insertadas.
- El modificador
params
solo se permite en matrices unidimensionales. No se permiten otros tipos de colección.
Otras restricciones son:
- Los atributos no se pueden aplicar a la expresión lambda, sus parámetros ni devoluciones.
- La expresión lambda debe convertirse en un tipo derivado de System.Linq.Expressions.Expression cuyo parámetro de tipo es un tipo delegado.
- Los parámetros con nombre y opcionales están restringidos. La expresión no puede llamar a un método que especifique argumentos con nombre y no puede usar el valor predeterminado de un parámetro opcional.
- No se permiten inicializadores de diccionario. Ninguno de ellos son métodos
Add
de extensión. - La expresión de destino debe ser una expresión lambda. No se permiten constantes y variables, pero es una expresión lambda que devuelve una constante o variable.
- No se permiten operaciones de puntero no seguras.
- Las llamadas COM deben incluir
ref
en argumentos; no pueden ser implícitas. - No se permite la palabra clave
__arglist
no admitida.