Почему нельзя использовать префикс и постфикс одновременно?

Почему следующий код недопустим?

using System;

class Program
{
    static void Main(string[] args) {
        int i = 0;
        --i++;
        Console.WriteLine(i);
    }
}

Это дает мне следующую ошибку на --i++:

The operand of an increment or decrement operator must be a variable, property or indexer

Я знаю, что этот код не имеет практического применения; Мне просто любопытно, почему это не разрешено. Мне все равно, что это можно исправить, удалив эту строку без других эффектов. Поскольку это помечено языком-юристом, пожалуйста, включите доказательства из языковой спецификации.

3 ответа

Решение

Из спецификации C# "7.6.9 Постфиксные операторы увеличения и уменьшения":

Операндом операции увеличения или уменьшения постфикса должно быть выражение, классифицированное как переменная, доступ к свойству или доступ индексатора. Результатом операции является значение того же типа, что и операнд.

Я думаю, что это отвечает на ваш вопрос.

Это также причина, по которой вы не можете сделать i++++ни с круглыми скобками: (i++)++ выдает ту же ошибку компиляции.

-- возвращает значение, не переменную, а оператор в ++ ожидает, что это будет переменная, поэтому она не работает.

-- а также ++ операторы не просто возвращают значения, они меняют переменную, с которой они работают. Независимо от того, какой порядок вы пытаетесь оценить --i++первый оператор возвращает значение, которому второй оператор не сможет присвоить свое возвращаемое значение обратно.

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