2012-10-26 16 views
5

Nếu loại chung được so sánh với null (và chỉ với null), điều này làm cho trình biên dịch hạn chế loại cả hai là rỗng (là ok) và là tương đương.Tại sao một kiểm tra null gây ra một ràng buộc bình đẳng trong F #?

Tại sao lại là thứ hai? Có vẻ như chỉ cần so sánh với null phải là ok đối với các loại không có giá trị, nhưng không hỗ trợ bình đẳng.

Tôi biết tôi có thể sử dụng Unchecked.equals để chỉ nhận được ràng buộc vô hiệu, chỉ cần tự hỏi nếu tôi thiếu một số lý do rõ ràng tại sao ((=) null) cần một đối số tương đương.

Trả lời

10

Nhà điều hành (=) có loại 'a -> 'a -> bool when 'a : equality. Vì vậy, việc sử dụng toán tử sẽ hạn chế kiểu đối số của nó để hỗ trợ sự bình đẳng. Mặc dù điều này thực sự là hạn chế không cần thiết khi bạn so sánh với chữ rỗng, tôi nghĩ rằng trình biên dịch chỉ sử dụng quy trình suy luận bình thường của nó thay vì coi nó là trường hợp đặc biệt.

Lưu ý rằng bạn luôn có thể sử dụng obj.ReferenceEquals(x, null) thay vào đó nếu các ràng buộc bổ sung có thể bị phản đối.

+0

Điểm tốt - lẽ ra phải tự tìm hiểu điều đó :) –