使用 ref 的函数调用中的 C# 执行顺序是什么?

What is C# order of execution in function call with ref?

所以我刚刚在我们的代码中发现了这个错误:

class A
{
    public int a;
}
var x = new A();
x.a = 1;
A qwe(ref A t) {
    t = new A();
    t.a = 2;
    return t;
}
void asd(A m, A n) {
    Console.WriteLine(m.a);
    Console.WriteLine(n.a);
}

asd(x, qwe(ref x));
asd(x, qwe(ref x));

函数调用的执行顺序是否指定了参数的顺序?

这里写的是:

1
2
2
2

这意味着在调用第二个参数的函数之前保存第一个参数的引用。

这是定义的行为吗?我在 C# 语言规范中找不到有关执行顺序的具体信息。

C# 要求传递给方法的参数表达式从左到右求值。

即使 qwe 在调用 asd 之前完成其工作,C# 已捕获对 "old" A before[=23] 的引用=] 调用 qwe 为调用做准备。这就是为什么 asd 的第一个调用的第一个参数在被 qwe 中的新 A 对象替换之前获得 "old" A 对象的原因打电话。