tutorial sintaxis expresiones español ejemplos c# lambda optional-parameters

sintaxis - ¿Es posible usar parámetros opcionales/predeterminados en una expresión lambda en c#?



lambda sintaxis (2)

La lambda coincidirá con cualquier firma que tenga asignada el delegado; sin ser asignado a un delegado un lambda no puede compilar.

Si el delegado contiene argumentos opcionales, el uso de ese delegado puede proporcionar opcionalmente argumentos. Si el delegado no lo hace, entonces el uso de ese delegado no puede omitir ningún argumento.

Si bien los delegados de Action y Func son muy útiles y pueden representar la mayoría de las firmas, no pueden representar ninguna firma con argumentos opcionales; Debes usar otra definición de delegado para eso.

Recuerde, Action y Func no son particularmente especiales, solo son dos delegados que todos usan para que no tengan que preocuparse por crear la suya por cada pequeña cosa.

¿Hay alguna forma de usar argumentos opcionales (parámetros predeterminados) con expresiones lambda en c #? He leído la documentación pero no puedo encontrar nada que decir de una manera u otra.

Para ilustrar, puedo definir un método simple que usa un argumento opcional para proporcionar un valor predeterminado como el siguiente:

void MyMethod(string arg = "default-value") { Console.WriteLine(arg); }

Lo que quiero saber es si puedo hacer lo mismo con una expresión lambda.

// gives a syntax error Action<string> MyMethod = (arg = "default") => Console.WriteLine(arg);

Puedo trabajar en un parámetro opcional con un valor predeterminado usando un delegado, pero esto parece un poco torpe.

delegate void MyDelegate(string arg = "default"); MyDelegate MyMethod = arg => Console.WriteLine(arg);

Alternativamente, podría revisar el parámetro en el cuerpo lambda, algo como ...

Action<string> MyMethod = (arg) => Console.WriteLine(string.IsNullOrEmpty(arg) ? "default" : arg);

Pero de nuevo esto parece un poco torpe.

¿Es posible usar parámetros opcionales para establecer un valor predeterminado en una expresión lambda en c #?


No. La persona que llama (el código que invoca al delegado) no "ve" la expresión lambda, por lo que no tiene sentido especificar el parámetro predeterminado allí. Todo el que llama es el delegado. En su caso, por ejemplo, el código de llamada solo conoce la Action<string> : ¿cómo debe saber el compilador el suministro del valor predeterminado especificado por la expresión lambda?

Como ejemplo de cómo las cosas se ponen difíciles, imagina si esto fuera viable. Entonces considera este código:

Action<string> action; if (DateTime.Today.Day > 10) { action = (string arg = "boo") => Console.WriteLine(arg); } else { action = (string arg = "hiss") => Console.WriteLine(arg); } action(); // What would the compiler do here?

Tenga en cuenta que el compilador proporciona el argumento en el sitio de la llamada . ¿Qué debería hacer con la línea final?

Es un poco como tener una interfaz y una implementación: si tiene un parámetro predeterminado en una interfaz, está bien; si solo lo tiene en la implementación, solo lo verán quienes llamen y conozcan la implementación específica. En el caso de las expresiones lambda, realmente no hay una implementación visible para que la use quien llama: solo está la firma del delegado.