Каков порядок выполнения C# в вызове функции с 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# lang spec.

1 ответ

Решение

C# требует, чтобы выражения параметров, передаваемые в методы, оценивались слева направо.

Хотя qwe заканчивает свою работу до вызова asdC# захватил ссылку на "старый" A перед вызовом qwe в подготовке к вызову. Вот почему первый аргумент первого вызова asd получает "старый" A объект, прежде чем он будет заменен новым A объект внутри qwe вызов.

Другие вопросы по тегам