Compartir a través de


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 o out.
  • 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:

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.