2012-10-26 11 views
5

Jeśli typ ogólny jest porównywany z null (i tylko z null), powoduje to, że kompilator ogranicza typ zarówno jako zerowy (co jest ok), jak i równoważny.Dlaczego zerowanie powoduje ograniczenie równości w F #?

Dlaczego ten drugi? Wydaje się, że po prostu porównanie z null powinno być ok dla typów, które są zerowalne, ale nie obsługują równości.

Wiem, że mogę użyć Unchecked.equals, aby uzyskać tylko zerowe ograniczenie, po prostu zastanawiam się, czy brakuje mi jakiegoś oczywistego powodu, dla którego ((=) null) potrzebuje równoważnego argumentu.

Odpowiedz

10

Operator (=) ma typ 'a -> 'a -> bool when 'a : equality. Zatem każde użycie operatora ograniczy typ jego argumentów, aby wspierać równość. Chociaż prawdą jest, że jest to technicznie niepotrzebne ograniczenie podczas porównywania z literą zero, myślę, że rozsądne jest, że kompilator po prostu używa swojej normalnej procedury wnioskowania, zamiast traktować ją jako specjalny przypadek.

Pamiętaj, że zawsze możesz użyć obj.ReferenceEquals(x, null), jeśli dodane ograniczenia są nieodpowiednie.

+0

Dobra uwaga - powinienem się tego domyślić :) –

Powiązane problemy