Глубокое понимание приветствуется.
Я сделаю все возможное.
Как отмечали другие ответы, здесь происходит то, что компилятор обнаруживает, что выражение используется в качестве оператора . Во многих языках - C, JavaScript и многих других - совершенно законно использовать выражение в качестве выражения. 2 + 2;
является законным на этих языках, хотя это утверждение не имеет никакого эффекта. Некоторые выражения полезны только для их значений, некоторые выражения полезны только для их побочных эффектов (таких как вызов метода возврата void), а некоторые выражения, к сожалению, полезны для обоих. (Как приращение.)
Дело в том, что утверждения, которые состоят только из выражений, почти наверняка являются ошибками, если только эти выражения обычно не считаются более полезными для их побочных эффектов, чем их значения . Разработчики C # хотели найти золотую середину, позволяя выражениям, которые обычно считались побочными, не допускать выражений, которые обычно считаются полезными для их значений. Множество выражений, которые они идентифицировали в C # 1.0, были приращениями, декрементами, вызовами методов, присваиваниями и, что довольно противоречиво, вызовами конструктора.
В стороне: обычно думают, что конструкция объекта используется как значение, которое он производит, а не как побочный эффект конструкции; по моему мнению, new Foo();
допуск - это немного неудача. В частности, я видел этот шаблон в реальном коде, который вызвал дефект безопасности:
catch(FooException ex) { new BarException(ex); }
Может быть удивительно трудно обнаружить этот дефект, если код сложен.
Поэтому компилятор работает для обнаружения всех операторов, которые состоят из выражений, которых нет в этом списке. В частности, выражения в скобках идентифицируются как просто выражения в скобках. Их нет в списке «разрешено в качестве выражений операторов», поэтому они запрещены.
Все это служит принципу разработки языка C #. Если вы печатали, (x++);
вы, вероятно, делали что-то не так . Это, вероятно, опечатка M(x++);
или просто вещь. Помните, что отношение команды компилятора C # не « можем ли мы найти какой-то способ заставить эту работу? » Отношение команды C # - « если правдоподобный код выглядит как вероятная ошибка, давайте сообщим разработчику ». Разработчикам C # нравится такое отношение.
Теперь, все , что сказал, есть на самом деле несколько странных случаев , когда C # спецификация делает предполагающие или состояние напрямую , что круглые скобки запрещены , но C # компилятор позволяет им в любом случае. Почти во всех этих случаях незначительное несоответствие между указанным поведением и разрешенным поведением совершенно безвредно, поэтому авторы компилятора никогда не исправляли эти небольшие ошибки. Вы можете прочитать о них здесь:
Есть ли разница между return myVar и return (myVar)?