lambda表达式的一个优点是,只有在需要结果时才需要计算函数.
在下面(简单)示例中,仅在编写器存在时才评估文本函数:
public static void PrintLine(Functext, TextWriter writer) { if (writer != null) { writer.WriteLine(text()); } }
不幸的是,这使得使用代码有点难看.你不能用常量或变量来调用它
PrintLine("Some text", Console.Out);
并且必须这样称呼它:
PrintLine(() => "Some text", Console.Out);
编译器无法从传递的常量"推断"无参数函数.有没有计划在未来的C#版本中改进这一点,还是我错过了什么?
更新:
我自己发现了一个肮脏的黑客:
public class F{ private readonly T value; private readonly Func func; public F(T value) { this.value = value; } public F(Func func) {this.func = func; } public static implicit operator F (T value) { return new F (value); } public static implicit operator F (Func func) { return new F (func); } public T Eval() { return this.func != null ? this.func() : this.value; } }
现在我可以将函数定义为:
public static void PrintLine(Ftext, TextWriter writer) { if (writer != null) { writer.WriteLine(text.Eval()); } }
并用函数或值来调用它.