C# 作用域运算符

标签 c# scope curly-braces

回到学校,我们编写了一个编译器,其中大括号具有执行所有表达式并返回最后一个值的默认行为...因此您可以编写如下内容:

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/

相关文章:

在 charCodeAt 上使用的 Javascript 应用或调用

javascript - OO Javascript - 正确的范围处理?

c++ - 使用圆括号而不是大括号和等号初始化结构

c# - .NET Web 服务的可扩展性

c# - 使用 Web API 和 JSON.NET 序列化对象时防止 $id/$ref

c# - 如何将 C# dll 导入 python

c# - 使用求和和排序依据的 Linq 查询

java - 解决组件问题 - 范围

c++ - 整数 vector vector 的统一初始化

groovy - 为什么 groovy 不能处理花括号?