回到学校,我们编写了一个编译器,其中大括号具有执行所有表达式并返回最后一个值的默认行为...因此您可以编写如下内容:
int foo = { printf("bar"); 1 };
C# 中有等效的东西吗?例如,如果我想编写一个有副作用的 lambda 函数。
关键不是关于 lambda 的副作用(只是一个例子),更多的是如果有这个功能......例如在 lisp 中,你有 progn
最佳答案
原则上,Vlad 的回答是正确的,您不需要提前将 lambda 函数声明为委托(delegate)。
除此之外,在 C# 中情况并不那么简单,因为编译器无法决定语法 lambda 表达式应该编译为委托(delegate)(例如 Func<int>
)还是表达式树(例如 Expression<Func<int>>
),而且,它可以是任何其他兼容的委托(delegate)类型。因此,您需要创建委托(delegate):
int foo = new Func<int>(() => {
Console.WriteLine("bar"); return 1; })();
您可以通过定义一个只返回委托(delegate)的方法然后调用该方法来稍微简化代码 - C# 编译器将自动推断委托(delegate)类型:
static Func<R> Scope<R>(Func<R> f) { return f; }
// Compiler automatically compiles lambda function
// as delegate and infers the type arguments of 'Scope'
int foo = Scope(() => { Console.WriteLine("bar"); return 1; })();
我同意这是一个不应该使用的丑陋技巧:-),但有趣的是它可以做到!
关于C# 作用域运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2338485/