Одним из преимуществ лямбда-выражений является то, что вы должны оценивать функцию только тогда, когда вам нужен ее результат.
В следующем (простом) примере текстовая функция оценивается только при наличии писателя:
public static void PrintLine(Func<string> text, TextWriter writer)
{
if (writer != null)
{
writer.WriteLine(text());
}
}
К сожалению, это делает использование кода немного уродливым. Вы не можете вызывать его с помощью константы или переменной типа
PrintLine("Some text", Console.Out);
и должны называть это так:
PrintLine(() => "Some text", Console.Out);
Компилятор не может "вывести" функцию без параметров из переданной константы. Есть ли планы улучшить это в будущих версиях C # или я что-то упустил?
UPDATE:
Я сам нашел грязный хак:
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;
}
}
Теперь я могу просто определить функцию как:
public static void PrintLine(F<string> text, TextWriter writer)
{
if (writer != null)
{
writer.WriteLine(text.Eval());
}
}
и вызовите его вместе с функцией или значением.