Wawasan mendalam dihargai.
Saya akan melakukan yang terbaik.
Seperti jawaban lain yang dicatat, apa yang terjadi di sini adalah kompiler mendeteksi bahwa ekspresi sedang digunakan sebagai pernyataan . Dalam banyak bahasa - C, JavaScript, dan banyak lainnya - sangat sah untuk menggunakan ekspresi sebagai pernyataan. 2 + 2;
legal dalam bahasa-bahasa ini, meskipun ini adalah pernyataan yang tidak berpengaruh. Beberapa ekspresi hanya berguna untuk nilainya, beberapa ekspresi hanya berguna untuk efek sampingnya (seperti panggilan ke metode pengembalian batal) dan beberapa ekspresi, sayangnya, berguna untuk keduanya. (Seperti kenaikan.)
Poinnya adalah: pernyataan yang hanya terdiri dari ekspresi hampir pasti kesalahan kecuali jika ekspresi itu biasanya dianggap lebih berguna untuk efek sampingnya daripada nilainya . Desainer C # ingin menemukan jalan tengah, dengan memungkinkan ekspresi yang umumnya dianggap sebagai efek samping, sementara melarang mereka yang juga biasanya dianggap berguna untuk nilai-nilai mereka. Rangkaian ekspresi yang mereka identifikasi dalam C # 1.0 adalah kenaikan, penurunan, pemanggilan metode, penugasan, dan agak kontroversial, pemanggilan konstruktor.
ASIDE: Orang biasanya menganggap konstruksi objek sebagai nilai yang dihasilkannya, bukan untuk efek samping konstruksi; menurut saya memungkinkan new Foo();
adalah sedikit kesalahan. Secara khusus, saya telah melihat pola ini dalam kode dunia nyata yang menyebabkan cacat keamanan:
catch(FooException ex) { new BarException(ex); }
Bisa jadi sangat sulit untuk menemukan cacat ini jika kodenya rumit.
Oleh karena itu kompiler berfungsi untuk mendeteksi semua pernyataan yang terdiri dari ekspresi yang tidak ada dalam daftar itu. Secara khusus, ekspresi dalam tanda kurung diidentifikasi hanya dengan itu - ekspresi dalam tanda kurung. Mereka tidak ada dalam daftar "diizinkan sebagai ekspresi pernyataan", sehingga mereka tidak diizinkan.
Semua ini demi prinsip desain bahasa C #. Jika Anda mengetik, (x++);
Anda mungkin melakukan kesalahan . Ini mungkin salah ketik M(x++);
atau sesuatu yang adil. Ingat, sikap tim kompiler C # bukanlah " bisakah kita mencari cara untuk membuat ini berhasil? " Sikap tim kompiler C # adalah " jika kode yang masuk akal tampak seperti kesalahan yang mungkin terjadi, mari beri tahu pengembang ". Pengembang C # menyukai sikap itu.
Sekarang, semua yang mengatakan, sebenarnya ada sebuah kasus aneh beberapa di mana C # spesifikasi yang menyiratkan atau negara langsung yang kurung dianulir tetapi C # compiler memungkinkan mereka anyways. Dalam hampir semua kasus perbedaan kecil antara perilaku yang ditentukan dan perilaku yang diizinkan benar-benar tidak berbahaya, sehingga penulis kompiler tidak pernah memperbaiki bug kecil ini. Anda dapat membaca tentang itu di sini:
Apakah ada perbedaan antara return myVar vs return (myVar)?