2012-10-26 25 views
5

如果通用类型与null(并且仅与null)进行比较,则会导致编译器将该类型限制为可为空(可以)并且可以是可等同的。为什么一个空检查会在F#中导致一个等式约束?

为什么后者?看起来只是与null比较应该可以用于可为空,但不支持相等的类型。

我知道我可以使用Unchecked.equals来得到可空的约束,只是想知道我是否缺少一些明显的原因,为什么((=) null)需要一个equatable参数。

回答

10

(=)运营商的类型为'a -> 'a -> bool when 'a : equality。因此,操作符的任何使用都会限制它的参数类型以支持相等性。虽然在技术上这是一个不必要的限制,但是我认为编译器只是使用它的正常推理过程而不是将其视为一种特殊情况是合理的。

请注意,如果添加的约束条件反对,则始终可以使用obj.ReferenceEquals(x, null)

+0

好点 - 本该想出来:) –

相关问题