无论如何都需要查一下,所以我想我也会在这里发布。
来自 C# 5.0 规范
5.3.3.21 嵌入表达式的一般规则
以下规则适用于这些类型的表达式:括号表达式 (§7.6.3)、元素访问表达式 (§7.6.6)、带索引的基本访问表达式 (§7.6.8)、递增和递减表达式 (§ 7.6.9, §7.7.5)、强制转换表达式 (§7.7.6)、一元 +、-、~、* 表达式、二进制 +、-、*、/、%、>、, >=, ==, !=, is, as, &, |, ^ 表达式(§7.8, §7.9, §7.10, §7.11),复合赋值表达式(§7.17.2),检查和未检查表达式(§7.6.12),以及数组和委托创建表达式 (§7.6.10)。
这些表达式中的每一个都有一个或多个子表达式,这些子表达式是无条件地按固定顺序计算的(强调我的)。例如,二进制 % 运算符先计算运算符的左侧,然后再计算右侧。索引操作计算索引表达式,然后按从左到右的顺序计算每个索引表达式。
每种表达式的详细规则在第 7 节中。我不会在这里全部列出,但是启发式是从左到右的,就像用代码编写的那样。例如
7.5.1.2 参数列表的运行时评估
参数列表的表达式总是按照它们的写入顺序进行计算。因此,示例
class Test
{
static void F(int x, int y = -1, int z = -2) {
System.Console.WriteLine("x = {0}, y = {1}, z = {2}", x, y, z);
}
static void Main() {
int i = 0;
F(i++, i++, i++);
F(z: i++, x: i++);
}
}
产生输出
x = 0, y = 1, z = 2
x = 4, y = -1, z = 3