所以我刚刚在我们的代码中发现了这个错误:
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规范中找到有关执行顺序的具体信息.
C#要求传递给方法的参数表达式从左到右进行求值.
即使qwe
在调用之前完成其工作asd
,C#也会A
在调用qwe
以准备调用之前捕获对"old"的引用.这就是为什么第一次调用的第一个参数在被调用内的新对象替换之前获取asd
"旧" A
对象A
的原因qwe
.