声明 lambda 必须使用大括号吗?

2023-12-05

准备 C# 考试。我对语句 lambda 必须使用大括号 {} 感到困惑。我从底部的控制问题中了解到这一点。下面的 Lambda 没有大括号就可以了。

class A
{
    public static Func<float, float> a = (x) => x * x;

}

问题

 10 . Which of the following statements about statement lambdas is false?
 a . A statement lambda can include more than one statement.
 b . A statement lambda cannot return a value.
 c . A statement lambda must use braces, { }.
 d . If a statement lambda returns a value, it must use a return statement.

Answer:

b.

下面的 Lambda 没有大括号就可以了

是的,但是这是一个表达式 lambda而不是一个声明 lambda。从这些文档中:

语句 lambda 类似于表达式 lambda,只不过语句括在大括号中

这是一个有点奇怪的问题,因为大括号的使用是什么makes它是一个 lambda 语句。回答b绝对是正确的,因为它是唯一的错误断言:statement lambdascan返回值。

语句 lambda 绝对可以包含多个语句,并且绝对可以返回一个值,尽管它必须使用 return 语句来执行此操作:

// Statement lambda with multiple statements, returning a value.
Func<int> statementLambda = () =>
{
    int x = 2;
    return x * 5;
};

关于术语的一点说明:我更喜欢术语“表达式体 lambda”和“块体 lambda”,部分原因是它更符合规范:

匿名函数体:
    表达
    block

然而,我们仍坚持使用目前的术语:(

要回答 dee zg 的答案(以及后面的评论)中的观点,请考虑以下两个赋值语句:

Action action = () => { Console.WriteLine("Statement lambda"); };
Action action2 = () => Console.WriteLine("Expression lambda");

第二个 lambda 表达式确实is表达式 lambda。 lambda 的主体是一个表达式而不是一个块。表达方式是这样的:

Console.WriteLine("Expression lambda")

(请注意,它没有分号;分号属于赋值。)

这对于表达式来说很不寻常,因为它没有结果。这是一个调用表达式,这是一种陈述表达式使用规范术语,并且仅在少数情况下允许。不过,在 lambda 表达式的转换中这很好。从第 11.7.1 节ECMA C# 5 标准(“匿名函数转换/一般”):

具体来说,匿名函数 F 与委托类型 D 兼容,前提是:

...

  • 如果身体F是一个表达式,并且D has a void返回类型或F is async and D有返回类型Task,那么当每个参数F给出了相应参数的类型D,F 的主体是一个有效的表达式(w.r.t §12),允许作为陈述表达式(第 13.7 节)。

A 陈述表达式(如第 13.7 节所述)可以是以下任意一种:

  • 调用表达式
  • 对象创建表达式
  • 任务
  • 后增量表达式
  • 后递减表达式
  • 预增量表达式
  • 预减表达式
  • 等待表达式

在这种情况下,我们有一个调用表达式(调用Console.WriteLine方法);一个没有结果的人。

请注意,虽然这两个 lambda 表达式在这里看起来几乎相同,但还是有区别:语句 lambda 不能转换为表达式树,而表达式 lambda 可以:

// Invalid: error CS0834: A lambda expression with a statement body
// cannot be converted to an expression tree
Expression<Action> action = () => { Console.WriteLine("Statement lambda"); };
// Valid
Expression<Action> action2 = () => Console.WriteLine("Expression lambda");

要进一步阅读有关表达式分类的内容,请参阅第 12.2.1 节:

表达式被分类为以下之一:

...

  • 没有什么。当表达式是对返回类型为 void 的方法的调用时,会发生这种情况。分类为无的表达式仅在语句表达式的上下文中有效(第 13.7 节)。

虽然我们通常将表达式视为计算值,但并非每个表达式都是如此。

有关调用表达式的更多详细信息,我们可以参阅第 12.7.6 节(重点是我的):

计算调用表达式的结果分类如下:

  • If the 调用表达式调用返回 void 的方法或委托,结果什么也没有。仅在语句表达式的上下文中才允许被分类为无的表达式 (§13.7)或者作为 lambda 表达式的主体(第 12.16 节)。否则会发生绑定时错误。
  • 否则,结果是一个值,具有方法或委托的返回类型的关联类型。 [...]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

声明 lambda 必须使用大括号吗? 的相关文章

  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col

随机推荐

  • Windows Phone 8 - 使用 Binding 将 byte[] 数组加载到 XAML 图像中

    我将图像存储为 byte 数组 因为我无法将它们存储为 BitmapImage ShotItem 类将存储在 ObservableCollection 中的isolatedStorage 中 namespace MyProject Mode
  • 需要有关从 Android 设备发送短信的帮助

    朋友们 任何人都提供一些示例代码来从 Android 设备发送短信 提前致谢 public void sendAText String phonenumber Intent intent new Intent Intent ACTION V
  • 将 char 指针作为结构成员写入文件问题

    我有一个 char 结构成员 并在结构初始化时将其分配给字符串文字 John 如下所示 使用 printf 可以很好地打印字符串 但是 如果我使用 fwrite 将此字符串写入文件 则在文件中我会读回垃圾 如果我使用 char 数组而不是
  • 如何链接到动态升压库?

    我编译了 boost lib 并得到了这些 Shared dynamic link libraries 24 03 2010 11 25 PM 53 248 boost thread vc80 mt 1 42 dll 24 03 2010
  • Rails 4 中命名空间路由的单独域

    我正在开发 Rails 4 应用程序 该应用程序的一部分是客户门户 必须从单独的域访问 通过导航到 我一切正常domain com cp 路由使用命名空间控制器 namespace cp do get dashboard to dashbo
  • eclipse中不在工作区中的项目的位置

    我有多个项目存储在我的本地计算机上 但不在我正在使用的 Eclipse 工作区中 但是当我打开同一个 Eclipse 工作区时 项目就在那里 这是如何实现的 工作区的元数据中是否有一个设置指定项目的存储位置 使用这种方法而不是将项目存储在工
  • Angular 4 - rxjs BehaviourSubject 在服务中的使用

    我的服务代码如下所示 数据服务 Injectable export class DataService private serviceRequestDtoSource new BehaviorSubject
  • PFLogInViewController 不再被识别?

    我正在 iOS 8 上使用最新版本的 Parse 构建 iPhone 应用程序 有人知道 PFLogInViewController 是否仍然存在吗 我很难将其纳入我的项目中 Parse 的其他一切都工作得很好 唯一的问题是 PFLogIn
  • PrettyFaces 与必需属性发生错误

    我正在使用开发一个网络应用程序JSF 2 and 漂亮脸蛋 我注释了我的一个 ViewScoped带有漂亮注释的bean 这就是我所拥有的 ManagedBean ViewScoped URLMapping parentId app lis
  • db.collection 不是一个函数 React / Firestore

    尝试使用 React 将 Firestore 实现到 LinkedIn 克隆中 我相信导入 Firebase firestore 的新方式如下 firebase js import initializeApp from firebase a
  • SparkR显示汉字错误

    我是SparkR新手 这几天遇到一个问题 将包含中文字符的文件转换成SparkR后 它不再正确显示 像这样 city c 北京 上海 杭州 A lt as data frame city A city 1 北京 2 上海 3 杭州 然后 我
  • Ruby/Rack 中的多部分响应

    我希望我的服务器发送多部分响应 multipart x mixed replace 我更喜欢使用 Sinatra 框架或通用 Rack 应用程序的某种解决方案 但 ruby 中的任何示例都很好 这相当于我在 PHP 中尝试做的事情 n pr
  • 这个 array_multisort() 为什么/如何工作?

    Code
  • 如何知道 iOS 设备何时插入?

    有没有办法知道我的设备 iPhone 何时插入电源 例如带有 USB 端口的计算机或汽车音响系统 我在我的应用程序中使用本地化服务 我想更改为kCLLocationAccuracyBestForNavigation当设备插入时自动 谢谢 您
  • C#:使用StreamReader从txt文件中读取行,但Peek()返回-1,即使还剩下很多行

    我使用 StreamReader 的 Peek 方法来检查是否还有更多行需要处理 我的文件中有 1000 多行 但是 Peek 在到达第 750 行时突然返回 1 我检查过 但第 750 行和第 751 行似乎没有区别 即使我删除了第750
  • 如何避免 MDIParent 表单调整大小

    我正在设计一个 Windows 窗体应用程序 我有一个 MDIParent 表单 它以最大化状态加载 并以最大化状态加载其子表单 但是 当我打开 OpenFileDialog 或任何数据读取器对象时 MDIParent 及其所有窗体和控件都
  • 如何在R中找到最短路径[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 问题 我有一个数据框 其中包含一组带有纬度和经度信息的点 我们需要从 A 开始 遍历其他每个节点一次 并在任意点结束 目标是最小化总的半正矢距离 df lt data frame name
  • TTS - CHECK_VOICE_DATA_FAIL - 检查引擎是否可用

    我的 TTS 引擎有一个奇怪的问题 我不知道为什么 我的错误在哪里 搜索了几个小时寻找解决方案 但没有任何可提及的结果 当我使用这个时API演示代码一切正常 我可以听到所有已安装语言的声音 但是当我检查时这个方法我收到 CHECK VOIC
  • 将默认光标更改为繁忙光标无法按预期工作

    经过多次尝试JProgressBar按照预期的工作 我终于成功地实现了我的目标 我曾经用过 疯狂程序员 s advice并使用了SwingWorker最终让程序按我想要的方式工作 Now I want the cursor to chang
  • 声明 lambda 必须使用大括号吗?

    准备 C 考试 我对语句 lambda 必须使用大括号 感到困惑 我从底部的控制问题中了解到这一点 下面的 Lambda 没有大括号就可以了 class A public static Func