Присвоение параметров метода в C # - PullRequest
3 голосов
/ 03 сентября 2010

Учитывая приведенный ниже код, будет ли параметру метода 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)
    {
    }
}

Ответы [ 5 ]

6 голосов
/ 03 сентября 2010

Параметр получает значение присваивания.

Рассмотрим код, подобный следующему:

int x = 0;
int y = (x = 1);
x = 42;
foo.Bar(y);

Eventhough x изменяется в другой раз, y по-прежнему содержит 1.

4 голосов
/ 03 сентября 2010

Он присваивается результату x=1, что равно 1.

3 голосов
/ 03 сентября 2010

Результат оператора присваивания будет передан в Bar, что «является значением, которое было присвоено левой стороне» (из в блоге Эрика Липперта ).

В данном случае это значение int 1.

1 голос
/ 03 сентября 2010

Вы должны рассмотреть порядок оценки.Перед вызовом функции любое выражение в фигурных скобках должно быть оценено.Затем результат используется в качестве аргумента в вызове функции.

В вашем случае x = 1 является выражением.Сначала необходимо оценить присвоение (x=1), затем вы можете использовать результирующее значение, равное x, и использовать его в качестве аргумента для bar.

Это эквивалентно

x = 1
foo.bar(x)

Вы можете увидеть, что оно будет оценено, если вы посмотрите на значение x после вызова foo.

0 голосов
/ 03 сентября 2010

Все, что внутри (), будет передано y, если это int.

Но я думаю, что, чтобы прямо ответить на вопрос, x - это то, что фактически передается, а не 1, x равен 1, тогда y = x = 1.

...