显然,C#同时处理嵌套表达式和链式表达式.

Foo(Bar(Baz().Bop()))可以按照以下顺序进行判断:

  • Baz()
  • Bop()
  • Bar()
  • Foo()

但是如果筑巢是线性的呢?考虑:Foo(Baz()).Bar(Bop())

显然,以下这些都是事实:

  • Foo之前Baz
  • Bar之前Foo
  • Bar之前Bop

但目前尚不清楚Bop人的具体判断时间.

  • 可能性#1
  • 可能性#2
  • 可能性#3

我的直觉是,第三种 Select 可能是正确的.i、 e.在开始判断.Bar(Bop())中的any之前,它将全面判断Foo(Baz())

虽然我当然可以测试个人情况,看看会发生什么,但这并不能告诉我我的猜测是否会是真的?

但我的问题是:

如果不是,至少我们知道它是确定性的吗?

推荐答案

你会在Section 11 of the specification分钟内找到答案.

具体来说,11.6.6 Function member invocation表示:

The run-time processing of a function member invocation consists of the following steps, where M is the function member and, if M is an instance member, E is the instance expression:
...

  • E进行了判断.如果此判断导致异常,则不会执行进一步的步骤.
  • 参数列表的判断如§11.6.2所述.

因此,给定一个表达式E.M(A)EA求值之前被完全求值.

对于Foo(Baz()).Bar(Bop())的情况,如果我们看Bar的判断(因此EFoo(Baz())MBar,参数列表是Bop()),这意味着在判断Bop(参数列表)之前,Foo(E)必须已经被完全判断过,这意味着"可能性#3"是正确的.

还有11.6.2.3 Run-time evaluation of argument lists个:

在函数成员调用的运行时处理过程中(§11.6.6),参数列表的表达式或变量引用按从左到右的顺序计算

所以在表达式M(A, B)中,AB求值之前被完全求值.

Csharp相关问答推荐

如何在C#中使用并行主义将数据表转换为动态对象

我正在制作一个Unity游戏,如果对这个玩家控制器进行编码,但当它 skip 时,它会删除我的速度

ASP.NET Core将SON重新序列化为派生类

无法使用并行库并行化我的代码

无法从具有一对多关系的C#类中使用Swagger创建记录

AutoMapper -如何为两个不同的用例设置单个映射?

.NET 8 Web-API返回空列表

创建临时Collection 最有效的方法是什么?堆栈分配和集合表达式之间的区别?

在路由中使用枚举

C#带主体的主构造函数?

当空判断结果赋给变量时,为什么会出现可能空异常警告的解引用?

正在从最小API-InvocationConext.Arguments中检索参数的FromBodyAttribute

EF Core:如何对关系属性进行建模?

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

EF Core 7-忽略模型绑定中的虚拟属性

在平行内使用跨度.用于循环

Foreach非常慢的C#

C#中使用ReadOnlySpan的泛型类型推理

DropDownListFor未显示选定值

如何从原始图像到新创建的图像获得相同的特定 colored颜色 ,并且具有相同的 colored颜色 量和相同的宽度和高度?