2012-10-26 9 views
5

Se un tipo generico viene confrontato con null (e solo con null), ciò fa sì che il compilatore vincoli il tipo sia come nullable (che è ok) sia come equabile.Perché un controllo Null causa un vincolo di uguaglianza in F #?

Perché quest'ultimo? Sembra che il solo confronto con lo null dovrebbe essere ok per i tipi che sono annullabili, ma non supportano l'uguaglianza.

So che posso usare Unchecked.equals per ottenere solo il vincolo annullabile, chiedo solo se mi manca qualche ragione evidente perché ((=) null) ha bisogno di un argomento equatable.

risposta

10

L'operatore (=) ha il tipo 'a -> 'a -> bool when 'a : equality. Quindi qualsiasi utilizzo dell'operatore vincolerà il tipo dei suoi argomenti per supportare l'uguaglianza. Mentre è vero che questa è tecnicamente una restrizione non necessaria quando si confronta il valore letterale nulla, penso che sia ragionevole che il compilatore usi solo la normale procedura di inferenza piuttosto che trattarla come un caso speciale.

Si noti che è sempre possibile utilizzare obj.ReferenceEquals(x, null) se i vincoli aggiunti sono discutibili.

+0

Buon punto - avrei dovuto capirlo da solo :) –

Problemi correlati