2012-10-26 3 views
5

Wenn ein generischer Typ mit null (und nur mit null) verglichen wird, bewirkt dies, dass der Compiler den Typ sowohl als Nullwert (was in Ordnung ist) als auch als gleichwertig einschränkt.Warum verursacht eine Nullprüfung eine Gleichheitsbedingung in F #?

Warum letzteres? Es scheint, dass nur der Vergleich mit null für Typen, die Nullable sind, aber keine Gleichheit unterstützt, in Ordnung sein sollte.

Ich weiß, ich kann Unchecked.equals verwenden, um nur die NULL-Einschränkung zu bekommen, nur frage mich, ob ich einige offensichtliche Gründe vermisse, warum ((=) null) ein gleichberechtigtes Argument benötigt.

Antwort

10

Der Operator (=) hat den Typ 'a -> 'a -> bool when 'a : equality. Daher wird jede Verwendung des Operators den Typ seiner Argumente einschränken, um die Gleichheit zu unterstützen. Es stimmt zwar, dass dies technisch gesehen eine unnötige Einschränkung ist, wenn Sie mit dem Null-Literal vergleichen, aber ich denke, es ist vernünftig, dass der Compiler nur seine normale Inferenz-Prozedur verwendet, anstatt sie als Sonderfall zu behandeln.

Beachten Sie, dass Sie stattdessen immer obj.ReferenceEquals(x, null) verwenden können, wenn die hinzugefügten Einschränkungen zu beanstanden sind.

+0

Guter Punkt - sollte das selbst herausgefunden haben :) –

Verwandte Themen