Учитывая приведенный ниже код, будет ли параметру метода y в Bar (int y) присвоено значение из x или 1? Я понимаю, что они логически эквивалентны, но я хочу понять операцию присваивания.
class Program { static void Main(string[] args) { var foo = new Foo(); var x = 0; foo.Bar(x = 1); } } public class Foo { public void Bar(int y) { } }
Параметр получает значение присваивания.
Рассмотрим код, подобный следующему:
int x = 0; int y = (x = 1); x = 42; foo.Bar(y);
Eventhough x изменяется в другой раз, y по-прежнему содержит 1.
x
y
1
Он присваивается результату x=1, что равно 1.
x=1
Результат оператора присваивания будет передан в Bar, что «является значением, которое было присвоено левой стороне» (из в блоге Эрика Липперта ).
Bar
В данном случае это значение int 1.
int
Вы должны рассмотреть порядок оценки.Перед вызовом функции любое выражение в фигурных скобках должно быть оценено.Затем результат используется в качестве аргумента в вызове функции.
В вашем случае x = 1 является выражением.Сначала необходимо оценить присвоение (x=1), затем вы можете использовать результирующее значение, равное x, и использовать его в качестве аргумента для bar.
x = 1
(x=1)
bar
Это эквивалентно
x = 1 foo.bar(x)
Вы можете увидеть, что оно будет оценено, если вы посмотрите на значение x после вызова foo.
foo
Все, что внутри (), будет передано y, если это int.
Но я думаю, что, чтобы прямо ответить на вопрос, x - это то, что фактически передается, а не 1, x равен 1, тогда y = x = 1.