5

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

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

我知道我可以用它Unchecked.equals来获得可为空的约束,只是想知道我是否遗漏了一些明显的原因,为什么((=) null)需要一个可平等的论点。

4

1 回答 1

10

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

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

于 2012-10-26T14:04:30.513 回答