Интересный результат упражнений для интервью: возврат, пост-приращение и поведение рефлекса

Вот простой код приложения консоли, который возвращает результат, который я не понимаю полностью.

Попробуйте подумать, выводит ли он 0, 1 или 2 в консоли:

using System;

namespace ConsoleApplication
{
    class Program
    {
        static void Main()
        {
            int i = 0;
            i += Increment(ref i);

            Console.WriteLine(i);
            Console.ReadLine();
        }

        static private int Increment(ref int i)
        {
            return i++;
        }
    }
}

Ответ равен 0.

Я не понимаю, почему post increment i++, из метода Increment, который выполняется на ref (а не на копии переданной переменной), увеличивает значение переменной, но это просто позже игнорируется.

Что я имею в виду в этом видео:

Может кто-нибудь объяснить этот пример и почему во время отладки я вижу, что это значение увеличивается до 1, но затем оно возвращается к 0?

Ответ 1

i += Increment(ref i); эквивалентно

i = i + Increment(ref i);

Выражение в правой части присваивания вычисляется слева направо, поэтому следующий шаг

i = 0 + Increment(ref i);

return i++ возвращает текущее значение i (которое равно 0), затем увеличивает i

i = 0 + 0;

Перед назначением значение i равно 1 (увеличивается в методе Increment), но присваивание снова делает его 0.

Ответ 2

Я думаю, что "волшебство" здесь - это просто приоритет операции порядок операций

i += Increment(ref i)

совпадает с

i = i + Increment(ref i)

операция + выполняется слева направо

так что сначала мы принимаем i... в то время как 0...

то мы добавим результат Increment (ref i)... который также равен 0... 0 + 0 = 0... но подождите... прежде чем мы получим этот результат, я фактически увеличивается...

что приращение происходит после того, как левый операнд нашей + операции оценивается b... поэтому он ничего не меняет... 0 + 0 все еще равен 0... таким образом, я присваивается 0 после того, как операция + выполнен

Ответ 3

Как вы упомянули - постинкремент "i ++". statement - "return я ++;" будет устанавливать значение "i" в памяти после того, как будет возвращено исходное значение.

попробуйте использовать "return ++ i;" и, вероятно, вы его получите.