Метод расширения C # не работает для сценариев увеличения и уменьшения, это по замыслу? - PullRequest
3 голосов
/ 25 мая 2009

Я пробую простой пример метода расширения и не могу увеличить или уменьшить int. Вот код

static class ExtensionMethodsExp
{
    public static void Print(this object o)
    {
        Console.WriteLine("This is print: {0}", o.ToString());
    }

    public static int Double(this int i)
    {
        return i * 2;
    }
    public static int Decrement(this int i)
    {
         return i--;
    }

    public static int Increment(this int i)
    {
        return i++;

    }
}

}

Программный код

class Program
{
    static void Main(string[] args)
    {

       int myNumber = 10;
       myNumber.Print();

       myNumber = myNumber.Double();
       myNumber.Print();

       myNumber = myNumber.Decrement(); 
       myNumber.Print();

       myNumber = myNumber.Increment();
       myNumber.Print();

       myNumber.Increment().Double().Print();
       Console.ReadKey();
    }
}

Я получаю следующее как вывод

Это печать: 10

Это печать: 20

Это печать: 20

Это печать: 20

Это печать: 40

Любая идея, почему Decrement или Increment здесь не работают. Есть ли что-то, что мне не хватает? спасибо

Ответы [ 5 ]

8 голосов
/ 25 мая 2009

Попробуйте это:

public static int Decrement(this int i)
{
     return --i;
}

public static int Increment(this int i)
{
    return ++i;
}
5 голосов
/ 25 мая 2009

Причина, по которой ваш код не работает, заключается в том, как вы используете операторы увеличения и уменьшения.

Когда вы пишете:

return i++;

Значение i возвращается ДО того, как произойдет приращение.

Попробуйте это:

return ++i;

или еще лучше, это:

return i + 1;
3 голосов
/ 25 мая 2009

Это не вопрос ссылки, поскольку вы присваиваете возвращаемое значение обратно значению.

Проблема здесь в том, что i++ увеличивает после , когда оно используется. В этом случае он возвращается, а затем увеличивается. Поскольку переменная является типом значения, увеличивается только локальная переменная внутри Increment ().

Если вы используете ++i, то локальный член увеличивается, а затем возвращается , что больше, чем вы ожидали.

Сказав это, сложно назвать ваш метод Increment или Decrement, поскольку он не присваивает значение обратно оригиналу. Вы пытались передать ref this i? Я понятия не имею, можно ли использовать ref в этой ситуации, но это может сделать наименование метода более точным. Эрик Липперт помешал этой идее.

0 голосов
/ 25 мая 2009

++i означает:

  • Увеличение значения i
  • Вернуть увеличенное значение

i++ означает:

  • Запомните текущее значение i
  • Увеличить значение i
  • Запомните предыдущее значение i (т. Е. До того, как вы его увеличили)

Один называется оператором «преинкремента», а другой - оператором «постинкремента».

0 голосов
/ 25 мая 2009

Это потому, что i ++ не увеличивает число до после , функция полностью оценена. К сожалению, в вашем примере вы возвращаете исходное значение, а увеличенное значение теряется в стеке!

++ i увеличивает i до , которое оценивает функция.

...