为什么空检查会导致F#中的等式约束?

时间:2012-10-26 13:24:03

标签: f# type-constraints

如果将泛型类型与null进行比较(并且只与null进行比较),则会导致编译器将类型约束为可空(可以)和等同。

为什么选择后者?似乎与null进行比较对于可以为空的类型应该是可以的,但是不支持相等。

我知道我可以使用Unchecked.equals来获得可以为空的约束,只是想知道我是否遗漏了((=) null)需要等同参数的明显原因。

1 个答案:

答案 0 :(得分:10)

(=)运算符的类型为'a -> 'a -> bool when 'a : equality。因此,运算符的任何使用都将限制其参数的类型以支持相等性。虽然从技术上讲,当你与null文字进行比较时,这在技术上是一个不必要的限制,但我认为编译器只使用其正常的推理过程而不是将其视为特殊情况是合理的。

请注意,如果添加的约束令人反感,您可以始终使用obj.ReferenceEquals(x, null)