Глибокі розуміння високо оцінені.
Я зроблю все можливе.
Як відзначали інші відповіді, компілятор, що відбувається тут, виявляє, що вираз використовується як вираз . У багатьох мовах - C, JavaScript та багатьох інших - цілком законно використовувати вираз як вислів. 2 + 2;
є законним цими мовами, хоча це твердження, яке не має ніякого ефекту. Деякі вирази корисні лише для своїх значень, деякі вирази корисні лише для їх побічних ефектів (наприклад, заклик до методу повернення недійсних даних), а деякі вирази, на жаль, корисні для обох. (Як приріст.)
Справа в тому, що: висловлювання, що складаються лише з виразів, майже напевно є помилками, якщо, як правило, ці вирази вважаються більш корисними для їх побічних ефектів, ніж їх значення . Дизайнери C # хотіли знайти середину, дозволяючи вирази, які, як правило, вважалися як побічні, одночасно забороняючи ті, які також вважаються корисними для їх значень. Набір виразів, які вони ідентифікували в C # 1.0, були приростами, скороченнями, викликами методів, призначеннями та дещо суперечливими викликами конструктора.
ВІДПОВІДЬ: Як правило, людина вважає, що конструкція об'єкта використовується як значення, яке воно виробляє, а не для побічного ефекту конструкції; на мою думку, це дозволяє new Foo();
трохи невдало. Зокрема, я бачив цю закономірність у реальному коді, що спричинив дефект безпеки:
catch(FooException ex) { new BarException(ex); }
Цей дефект напрочуд важко помітити, якщо код складний.
Таким чином, компілятор працює над тим, щоб виявити всі висловлювання, що складаються з виразів, яких немає у цьому списку. Зокрема, викладені в дужках вирази ідентифікуються як саме це - виразки в дужках. Їх немає у списку "дозволено як вирази висловлювань", тому їх заборонено.
Все це відповідає принципу дизайну мови C #. Якщо ви ввели текст, (x++);
ви, ймовірно, робили щось не так . Це, мабуть, помилка друку M(x++);
чи якась справедлива річ. Пам'ятайте, що ставлення команди компілятора C # не полягає в тому, "чи можемо ми знайти якийсь спосіб зробити цю роботу? " Ставлення команди компілятора C # таке: " якщо правдоподібний код виглядає як ймовірна помилка, повідомляємо розробника ". C # розробникам подобається таке ставлення.
Тепер, все , що сказав, є на самому ділі кілька дивних випадків , коли C # специфікація робить передбачають або стан безпосередньо , що круглі дужки заборонені , але C # компілятор дозволяє їм в будь-якому випадку. Майже у всіх цих випадках незначна невідповідність між вказаною поведінкою та дозволеною поведінкою є абсолютно нешкідливою, тому автори-компілятори ніколи не виправляли цих маленьких помилок. Про них можна прочитати тут:
Чи є різниця між поверненням myVar проти повернення (myVar)?