Hiểu biết sâu sắc đánh giá cao.
Tôi sẽ làm hết sức mình.
Như các câu trả lời khác đã lưu ý, những gì đang diễn ra ở đây là trình biên dịch đang phát hiện ra rằng một biểu thức đang được sử dụng như một câu lệnh . Trong nhiều ngôn ngữ - C, JavaScript và nhiều ngôn ngữ khác - việc sử dụng một biểu thức làm tuyên bố là hoàn toàn hợp pháp. 2 + 2;
là hợp pháp trong các ngôn ngữ này, mặc dù đây là một tuyên bố không có hiệu lực. Một số biểu thức chỉ hữu ích cho các giá trị của chúng, một số biểu thức chỉ hữu ích cho các tác dụng phụ của chúng (chẳng hạn như gọi đến phương thức trả về khoảng trống) và một số biểu thức, không may, hữu ích cho cả hai. (Giống như gia tăng.)
Điểm hiện hữu: các câu lệnh chỉ bao gồm các biểu thức gần như chắc chắn là các lỗi trừ khi các biểu thức đó thường được cho là hữu ích hơn cho các tác dụng phụ của chúng so với các giá trị của chúng . Các nhà thiết kế C # muốn tìm một nền tảng trung gian, bằng cách cho phép các biểu thức thường được coi là có tác dụng phụ, trong khi không cho phép các biểu thức thường được coi là hữu ích cho các giá trị của chúng. Tập hợp các biểu thức mà chúng đã xác định trong C # 1.0 là các số gia, số giảm, lệnh gọi phương thức, bài tập và một số tranh cãi, các cách gọi của hàm tạo.
ASIDE: Người ta thường nghĩ về việc xây dựng đối tượng là được sử dụng cho giá trị mà nó tạo ra, không phải cho tác dụng phụ của việc xây dựng; theo ý kiến của tôi cho phép new Foo();
là một chút sai lầm. Cụ thể, tôi đã thấy mô hình này trong mã trong thế giới thực gây ra lỗi bảo mật:
catch(FooException ex) { new BarException(ex); }
Thật khó có thể ngạc nhiên khi phát hiện ra khiếm khuyết này nếu mã phức tạp.
Do đó trình biên dịch hoạt động để phát hiện tất cả các câu lệnh bao gồm các biểu thức không có trong danh sách đó. Cụ thể, các biểu thức được ngoặc đơn được xác định là như vậy - các biểu thức được ngoặc đơn. Chúng không nằm trong danh sách "được phép dưới dạng biểu thức câu lệnh", vì vậy chúng không được phép.
Tất cả điều này là để phục vụ cho một nguyên tắc thiết kế của ngôn ngữ C #. Nếu bạn gõ (x++);
bạn có thể đã làm điều gì đó sai . Đây có lẽ là một lỗi đánh máy cho M(x++);
hoặc một số điều. Hãy nhớ rằng, thái độ của nhóm trình biên dịch C # không phải là " chúng ta có thể tìm ra cách nào đó để thực hiện công việc này không? " Thái độ của nhóm trình biên dịch C # là " nếu mã hợp lý có vẻ như là một lỗi có thể xảy ra, hãy thông báo cho nhà phát triển ". Các nhà phát triển C # thích thái độ đó.
Bây giờ, tất cả những gì đã nói, có thực sự là một vài trường hợp lẻ nơi # đặc điểm kỹ thuật C không ngụ ý hoặc trạng thái hoàn toàn rằng ngoặc là không được phép nhưng biên dịch C # cho phép chúng anyways. Trong hầu hết các trường hợp, sự khác biệt nhỏ giữa hành vi được chỉ định và hành vi được phép là hoàn toàn vô hại, vì vậy người viết trình biên dịch chưa bao giờ sửa các lỗi nhỏ này. Bạn có thể đọc về những người ở đây:
Có sự khác biệt giữa return myVar so với return (myVar) không?