Compartir a través de


Errores y advertencias al usar expresiones lambda y funciones anónimas

Hay varios errores relacionados con la declaración y el uso de expresiones lambda:

  • CS0748: Uso incoherente de parámetros lambda; los tipos de parámetro deben ser todos explícitos o todos implícitos.
  • CS1621: la instrucción yield no se puede usar dentro de un método anónimo o una expresión lambda.
  • CS1628: no se puede usar inref o out parámetro dentro de un método anónimo, una expresión lambda o una expresión de consulta.
  • CS1632: El control no puede dejar el cuerpo de un método anónimo o una expresión lambda.
  • CS1673: Los métodos anónimos, las expresiones lambda y las expresiones de consulta dentro de las estructuras no pueden tener acceso a los miembros de instancia de "this".
  • CS1686: la variable local o sus miembros no pueden tener su dirección tomada y usarse dentro de un método anónimo o una expresión lambda.
  • CS1706: La expresión no puede contener métodos anónimos ni expresiones lambda.
  • CS8030: la función anónima convertida en un delegado que devuelve void no puede devolver un valor.
  • CS8175: no se puede usar ref local dentro de un método anónimo, una expresión lambda o una expresión de consulta.
  • CS8916: los atributos de las expresiones lambda requieren una lista de parámetros entre paréntesis.
  • CS8971: InterpolatedStringHandlerArgument no tiene ningún efecto cuando se aplica a los parámetros lambda y se omitirá en el sitio de llamada.
  • CS8975: la palabra clave var contextual no se puede usar como un tipo de valor devuelto lambda explícito.
  • CS9098: parámetro lambda con tipo implícito '...' no puede tener un valor predeterminado.

Además, hay varias advertencias relacionadas con la declaración y el uso de expresiones lambda:

  • CS8971: InterpolatedStringHandlerArgument no tiene ningún efecto cuando se aplica a los parámetros lambda y se omitirá en el sitio de llamada.
  • CS9099: el valor del parámetro predeterminado no coincide con el tipo de delegado de destino.
  • CS9100: El parámetro tiene un modificador 'params' en la expresión lambda, pero no en el tipo de delegado de destino.

El compilador también genera el siguiente mensaje informativo :

  • CS9236: La compilación requiere enlazar la expresión lambda al menos una cierta cantidad de veces. Considere declarar la expresión lambda con parámetros de tipos explícitos, o si la llamada al método contenedor es genérica, considere usar argumentos de tipo explícitos.

Limitaciones de sintaxis en expresiones lambda

Algunas sintaxis de C# están prohibidas en expresiones lambda y métodos anónimos. El uso de construcciones no válidas en una expresión lambda produce los errores siguientes:

  • CS1621: la yield instrucción no se puede usar dentro de un método anónimo o una expresión lambda.
  • CS1628: no se puede usar inel parámetro , refo out dentro de un método anónimo, una expresión lambda o una expresión de consulta.
  • CS1632: El control no puede dejar el cuerpo de un método anónimo o una expresión lambda.
  • CS1673: los métodos anónimos, las expresiones lambda y las expresiones de consulta dentro de estructuras no pueden tener acceso a los miembros de instancia de this.
  • CS1686: la variable local o sus miembros no pueden tener su dirección tomada y usarse dentro de un método anónimo o una expresión lambda.
  • CS8175: no se puede usar ref local dentro de un método anónimo, una expresión lambda o una expresión de consulta.

No se permiten todas las construcciones siguientes en expresiones lambda:

  • yield instrucciones (yield return o yield break)
  • Llamada a un método que tiene un parámetro in, ref, o out
  • ref variables locales
  • breakinstrucciones , gotoy continue
  • this access cuando this es un struct tipo
  • Métodos anónimos o expresiones lambda dentro de otra expresión, como un constructor Attribute.

No se puede usar ninguna de estas construcciones en una expresión lambda ni en un método anónimo. Se permiten muchos en una función local.

Además, los tipos de controlador de cadenas interpoladas se omiten cuando se aplican a un parámetro lambda. Si usa una, verá la siguiente advertencia:

  • CS8971: InterpolatedStringHandlerArgument no tiene ningún efecto cuando se aplica a los parámetros lambda y se omitirá en el sitio de llamada.

Algunas expresiones hacen que el compilador emita la siguiente advertencia informativa:

  • CS9236: La compilación requiere enlazar la expresión lambda al menos un número específico de veces. Considere declarar la expresión lambda con tipos de parámetro explícitos o, si la llamada al método contenedor es genérica, considere usar argumentos de tipo explícitos.

La complejidad de las expresiones lambda y cómo invocan otras expresiones lambda afecta negativamente al rendimiento del compilador. La razón es que el compilador debe inferir los tipos de parámetros y argumentos a través de las expresiones lambda y los posibles tipos tardan tiempo.

Parámetros y devoluciones de expresiones lambda

Estos errores indican un problema con una declaración de parámetro:

  • CS0748: Uso incoherente de parámetros lambda; los tipos de parámetro deben ser todos explícitos o todos implícitos.
  • CS9098: parámetro lambda con tipo implícito '...' no puede tener un valor predeterminado.
  • CS8030: la función anónima convertida en un delegado que devuelve void no puede devolver un valor.
  • CS8916: los atributos de las expresiones lambda requieren una lista de parámetros entre paréntesis.
  • CS8975: La palabra clave contextual 'var' no se puede usar como un tipo de valor devuelto lambda explícito.

Los parámetros de expresión lambda deben seguir estas reglas:

  • Cuando una expresión lambda tiene varios parámetros, todos los parámetros deben escribirse explícitamente o todos los parámetros deben escribirse implícitamente.
  • Todos los parámetros lambda con un valor predeterminado deben escribirse explícitamente.
  • Si los atributos se aplican a cualquier parámetro, la lista de parámetros debe incluirse entre paréntesis.

Los tipos devueltos de expresión lambda deben seguir estas reglas:

  • Una expresión lambda que devuelve cualquier valor no se puede convertir a un void delegado devuelto, como Action.
  • El tipo de valor devuelto es inferido o explícito. No se permite un tipo de valor devuelto declarado mediante la palabra clave var .

Tipo de delegado de expresión lambda

  • CS9099: Advertencia: el valor del parámetro predeterminado no coincide con el tipo de delegado de destino.

Al declarar un valor predeterminado o agregar el modificador params con un parámetro de expresión lambda, el tipo delegado no es uno de los tipos Func o Action. En su lugar, es un tipo personalizado que incluye el valor de parámetro predeterminado o el modificador params. El código siguiente genera advertencias porque asigna una expresión lambda que tiene un parámetro predeterminado a un Action tipo:

Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };

Para corregir el error, quite el parámetro predeterminado o use una variable con tipo implícito para el tipo delegado:

Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };