2
let i = ref 123
let j = ref 123
i = j   // true

同様に:

let i = box 123
let j = box 123
i = j   // true

おそらく、iとjは実際にはメモリ内の同じ正確な場所を指していません... ??

2番目のケースでは、次のようにしてこの(奇妙な?)動作を回避します。

obj.ReferenceEquals (i, j)    // false

最初のケースの適切な同等性テストは何ですか?

編集:

obj.ReferenceEqualsの呼び出しは、最初のケースでも機能することがわかります。

しかし、誰かが私にこの関数を呼び出さなければならない理由を説明できますか?=演算子だけを使用できないのはなぜですか?

4

2 に答える 2

4

=)演算子はGenericEqualityObjを呼び出します。最初に引数のタイプ(配列、への割り当て可能性IStructuralEquatable、およびその他のいくつかの特殊なケース)をチェックし、最後のケースで。を呼び出しますobj.Equals。ビット比較を行うために(派生)Equalsによってオーバーライドされます。それが理由を説明しています。ValueTypeint(box 123) = (box 123)true

于 2012-06-22T20:37:03.137 に答える
3

参照セルはレコードを使用して表されます。デフォルトでは、レコードは構造的に比較可能です。

于 2012-06-22T15:36:15.477 に答える