Docenione głębokie spostrzeżenia.
Zrobię co w mojej mocy.
Jak zauważyły inne odpowiedzi, kompilator wykrywa, że wyrażenie jest używane jako instrukcja . W wielu językach - C, JavaScript i wielu innych - użycie wyrażenia jako instrukcji jest całkowicie legalne. 2 + 2;
jest legalne w tych językach, mimo że jest to stwierdzenie, które nie ma żadnego skutku. Niektóre wyrażenia są przydatne tylko ze względu na ich wartości, niektóre wyrażenia są przydatne tylko ze względu na ich skutki uboczne (takie jak wywołanie metody zwracającej void), a niektóre wyrażenia niestety są przydatne w obu przypadkach. (Podobnie jak przyrost.)
Chodzi o to, że stwierdzenia, które składają się tylko z wyrażeń, są prawie na pewno błędami, chyba że te wyrażenia są zwykle uważane za bardziej przydatne ze względu na ich skutki uboczne niż ich wartości . Projektanci języka C # chcieli znaleźć kompromis, dopuszczając wyrażenia, które były ogólnie uważane za efekt uboczny, jednocześnie odrzucając te, które są również zwykle uważane za przydatne dla ich wartości. Zbiór wyrażeń, które zidentyfikowali w C # 1.0, to przyrosty, ubytki, wywołania metod, przypisania i nieco kontrowersyjne wywołania konstruktorów.
POZA STRONĄ: Zwykle uważa się, że konstrukcja obiektu jest używana ze względu na wartość, którą wytwarza, a nie jako efekt uboczny konstrukcji; moim zdaniem przyzwolenie new Foo();
jest trochę błędem. W szczególności widziałem ten wzorzec w rzeczywistym kodzie, który spowodował usterkę bezpieczeństwa:
catch(FooException ex) { new BarException(ex); }
Zaskakująco trudno jest wykryć tę wadę, jeśli kod jest skomplikowany.
Dlatego kompilator wykrywa wszystkie instrukcje zawierające wyrażenia, których nie ma na tej liście. W szczególności wyrażenia w nawiasach są identyfikowane właśnie jako takie - wyrażenia w nawiasach. Nie ma ich na liście „dozwolonych jako wyrażenia instrukcji”, więc są niedozwolone.
Wszystko to służy zasadzie projektowania języka C #. Jeśli wpisałeś (x++);
, prawdopodobnie zrobiłeś coś nie tak . To prawdopodobnie literówka M(x++);
lub po prostu coś. Pamiętaj, nastawienie zespołu kompilatora C # nie brzmi: „ czy możemy wymyślić jakiś sposób, aby to zadziałało? ”. Postawa zespołu kompilatora C # brzmi: „ jeśli wiarygodny kod wygląda na prawdopodobny błąd, poinformujmy o tym programistę ”. Deweloperzy C # lubią to podejście.
Teraz wszystko, co powiedział, jest rzeczywiście kilka dziwnych przypadków, w których specyfikacja C # ma sugerować lub państwowe wprost, że nawiasy są niedozwolone, ale kompilator C # pozwala je tak czy inaczej. W prawie wszystkich tych przypadkach niewielka rozbieżność między określonym zachowaniem a dozwolonym zachowaniem jest całkowicie nieszkodliwa, więc twórcy kompilatorów nigdy nie naprawili tych małych błędów. Możesz przeczytać o nich tutaj:
Czy istnieje różnica między return myVar a return (myVar)?