Conocimientos profundos apreciados.
Haré lo mejor que pueda.
Como han señalado otras respuestas, lo que está sucediendo aquí es que el compilador está detectando que una expresión se está utilizando como una declaración . En muchos lenguajes, C, JavaScript y muchos otros, es perfectamente legal usar una expresión como una declaración. 2 + 2;
es legal en estos idiomas, a pesar de que esta es una declaración que no tiene ningún efecto. Algunas expresiones son útiles solo por sus valores, algunas expresiones son útiles solo por sus efectos secundarios (como una llamada a un método de retorno nulo) y algunas expresiones, desafortunadamente, son útiles para ambos. (Como incremento).
El punto es: las declaraciones que consisten solo en expresiones son casi con certeza errores a menos que esas expresiones se consideren más útiles para sus efectos secundarios que sus valores . Los diseñadores de C # deseaban encontrar un punto medio, permitiendo expresiones que generalmente se consideraban como efectos secundarios, mientras que no permitían aquellas que también se consideran útiles para sus valores. El conjunto de expresiones que identificaron en C # 1.0 fueron incrementos, decrementos, llamadas a métodos, asignaciones y, de forma algo controvertida, invocaciones de constructores.
A UN LADO: Uno normalmente piensa que la construcción de un objeto se usa por el valor que produce, no por el efecto secundario de la construcción; en mi opinión, permitir new Foo();
es un poco un error. En particular, he visto este patrón en el código del mundo real que causó un defecto de seguridad:
catch(FooException ex) { new BarException(ex); }
Puede ser sorprendentemente difícil detectar este defecto si el código es complicado.
Por lo tanto, el compilador funciona para detectar todas las declaraciones que consisten en expresiones que no están en esa lista. En particular, las expresiones entre paréntesis se identifican solo como eso: expresiones entre paréntesis. No están en la lista de "permitidas como expresiones de declaración", por lo que no están permitidas.
Todo esto está al servicio de un principio de diseño del lenguaje C #. Si escribiste (x++);
, probablemente estabas haciendo algo mal . Esto es probablemente un error tipográfico M(x++);
o algo justo. Recuerde, la actitud del equipo compilador de C # no es " ¿podemos encontrar alguna forma de hacer que esto funcione? " La actitud del equipo compilador de C # es " si el código plausible parece un posible error, informemos al desarrollador ". A los desarrolladores de C # les gusta esa actitud.
Ahora, todo lo que dijo, en realidad hay unos pocos casos raros en que la especificación C # no implica ni del estado de plano que los paréntesis no están permitidos, pero el compilador de C # les permite de todos modos. En casi todos esos casos, la discrepancia menor entre el comportamiento especificado y el comportamiento permitido es completamente inofensiva, por lo que los escritores del compilador nunca han solucionado estos pequeños errores. Puedes leer sobre eso aquí:
¿Hay alguna diferencia entre return myVar y return (myVar)?