Câu trả lời của Tejas là chính xác. Để cụ thể hơn giải quyết một số điểm của bạn:
Tại sao mã sau không dẫn đến lỗi biên dịch?
Câu hỏi không đáng trả lời; nó không tạo ra một lỗi vì nó là mã pháp lý, nhưng đó là một thuật ngữ.
Nếu câu hỏi của bạn thực sự là "phần nào trong đặc tả C# làm cho điều này hợp pháp?", Thì đó là một câu hỏi có thể trả lời được. Phần trên các nhà khai thác bình đẳng dỡ bỏ làm cho nó hợp pháp.
So sánh loại tham chiếu với loại nguyên thủy.
Nó không phải. Trước hết, tránh thuật ngữ "kiểu nguyên thủy"; các đặc điểm kỹ thuật không xác định rõ ràng nó và nó không phải là một khái niệm hữu ích trong C#. Bạn có nghĩa là để nói rằng tôi nghĩ rằng nó là so sánh một giá trị của loại tài liệu tham khảo để một giá trị của loại giá trị.
Thứ hai, điều đó cũng không đúng. Chữ rỗng không phải kiểu tham chiếu hoặc kiểu giá trị; nó không thuộc loại nào cả. Đó là có thể chuyển đổi thành bất kỳ loại giá trị có thể vô giá nào hoặc bất kỳ loại tham chiếu nào, nhưng không phải chỉ loại nào.
Trong trường hợp này, chữ rỗng được chuyển thành loại bool có thể vô hiệu hóa.
Cả hai giá trị rỗng và sai phải được hiểu là điều gì đó để trình biên dịch so sánh.
Đúng. Chúng được hiểu là bool nullable.
là trình phân tích cú pháp chỉ cần quét mẫu đó và thay thế bằng sai?
Không, nhưng đó là một dự đoán tuyệt vời. Trình biên dịch sẽ không đổi lần, giả sử, true == false
xuống đến false
, nhưng nó không thực hiện tối ưu hóa gấp có liên quan đến các loại giá trị không thể thực hiện được. Ngôn ngữ có thể được thiết kế lại để hỗ trợ việc gấp liên tục trên các phép toán với các toán hạng kiểu giá trị rỗng; đã có các kiểu giá trị vô hiệu hóa được phản đối trong phiên bản một, tính năng được đề xuất có thể sẽ được hỗ trợ.
Loại giá trị hay không, 'false' vẫn là một đối tượng. Nó có thể sẽ được đóng hộp để so sánh. – cHao
@cHao: Giả thuyết của bạn không chính xác. Các nhà điều hành bình đẳng được thiết kế đặc biệt để tránh đấm bốc; đọc thông số kỹ thuật để biết chi tiết. –