2012-10-26 63 views
5

如果通用類型與null(並且僅與null)進行比較,則會導致編譯器將該類型限制爲可爲空(可以)並且可以是可等同的。爲什麼一個空檢查會在F#中導致一個等式約束?

爲什麼後者?看起來只是與null比較應該可以用於可爲空,但不支持相等的類型。

我知道我可以使用Unchecked.equals來得到可空的約束,只是想知道我是否缺少一些明顯的原因,爲什麼((=) null)需要一個equatable參數。

回答

10

(=)運營商的類型爲'a -> 'a -> bool when 'a : equality。因此,操作符的任何使用都會限制它的參數類型以支持相等性。雖然在技術上這是一個不必要的限制,但是我認爲編譯器只是使用它的正常推理過程而不是將其視爲一種特殊情況是合理的。

請注意,如果添加的約束條件反對,則始終可以使用obj.ReferenceEquals(x, null)

+0

好點 - 本該想出來:) –

相關問題