Una de las ventajas de las expresiones lambda es que debe evaluar una función solo cuando necesita su resultado.C# expresiones lambda y evaluación diferida
En el ejemplo siguiente (simple), la función de texto sólo se evalúa cuando un escritor está presente:
public static void PrintLine(Func<string> text, TextWriter writer)
{
if (writer != null)
{
writer.WriteLine(text());
}
}
Desafortunadamente, esto hace que el uso del código un poco feo. No se puede llamar con una constante o variable, como
PrintLine("Some text", Console.Out);
y tienen que llamar de esta manera:
PrintLine(() => "Some text", Console.Out);
El compilador no es capaz de "inferir" una función sin parámetros de la constante pasado. ¿Hay algún plan para mejorar esto en versiones futuras de C# o me falta algo?
ACTUALIZACIÓN:
simplemente me encontré con un sucio cortar a mí mismo:
public class F<T>
{
private readonly T value;
private readonly Func<T> func;
public F(T value) { this.value = value; }
public F(Func<T> func) {this.func = func; }
public static implicit operator F<T>(T value)
{
return new F<T>(value);
}
public static implicit operator F<T>(Func<T> func)
{
return new F<T>(func);
}
public T Eval()
{
return this.func != null ? this.func() : this.value;
}
}
Ahora sólo puedo definir la función como:
public static void PrintLine(F<string> text, TextWriter writer)
{
if (writer != null)
{
writer.WriteLine(text.Eval());
}
}
y lo llaman tanto con una función o una valor.
Estoy de acuerdo. En el caso de agregar una sobrecarga, sería imposible notar la diferencia [si dicho atajo fuera compatible]. – Krisc