所以我刚刚在代码中发现了这个错误:
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#lang规范中找到有关执行顺序的具体信息。
答案 0 :(得分:8)
C#要求传递给方法的参数表达式从左到右进行计算。
即使qwe
在调用asd
之前完成了工作,C#也会在调用{{1}之前捕获对“旧”A
的引用准备电话。这就是qwe
第一次调用的第一个参数在被asd
调用中的新A
对象替换之前获取“旧”A
对象的原因。