Apreciação profunda.
Eu farei o meu melhor.
Como outras respostas observaram, o que está acontecendo aqui é que o compilador está detectando que uma expressão está sendo usada como uma declaração . Em muitos idiomas - C, JavaScript e muitos outros - é perfeitamente legal usar uma expressão como uma declaração. 2 + 2;
é legal nesses idiomas, mesmo que essa seja uma declaração que não tem efeito. Algumas expressões são úteis apenas para seus valores, algumas expressões são úteis apenas para seus efeitos colaterais (como uma chamada para um método de retorno nulo) e algumas expressões, infelizmente, são úteis para ambos. (Como incremento.)
A questão é: declarações que consistem apenas em expressões são quase certamente erros, a menos que essas expressões sejam consideradas mais úteis para seus efeitos colaterais do que seus valores . Os designers de C # desejavam encontrar um meio termo, permitindo expressões que geralmente eram consideradas como efeito colateral, enquanto não permitiam aquelas que também são geralmente consideradas úteis para seus valores. O conjunto de expressões que eles identificaram no C # 1.0 foram incrementos, decréscimos, chamadas de método, atribuições e, de certa forma controversa, invocações de construtores.
À parte: Normalmente, considera-se uma construção de objeto como sendo usada pelo valor que produz, não pelo efeito colateral da construção; na minha opinião, permitir new Foo();
é um pouco incorreto. Em particular, eu vi esse padrão no código do mundo real que causou um defeito de segurança:
catch(FooException ex) { new BarException(ex); }
Pode ser surpreendentemente difícil detectar esse defeito se o código for complicado.
O compilador, portanto, trabalha para detectar todas as instruções que consistem em expressões que não estão nessa lista. Em particular, expressões entre parênteses são identificadas como exatamente isso - expressões entre parênteses. Eles não estão na lista de "permitido como expressões de instrução", portanto, não são permitidos.
Tudo isso está em serviço de um princípio de design da linguagem C #. Se você digitou (x++);
, provavelmente estava fazendo algo errado . Este é provavelmente um erro de digitação M(x++);
ou algo justo. Lembre-se, a atitude da equipe do compilador C # não é " podemos descobrir uma maneira de fazer isso funcionar? " A atitude da equipe do compilador C # é " se um código plausível parecer um provável erro, vamos informar o desenvolvedor ". Desenvolvedores de C # gostam dessa atitude.
Agora, tudo o que disse, realmente existem alguns casos estranhos onde o # especificação C não implicam ou estaduais abertamente que parênteses são permitidos, mas o compilador C # permite que eles de qualquer maneira. Em quase todos esses casos, a menor discrepância entre o comportamento especificado e o permitido é totalmente inofensiva, portanto, os escritores do compilador nunca corrigiram esses pequenos bugs. Você pode ler sobre aqueles aqui:
Existe uma diferença entre return myVar vs. return (myVar)?