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 实际上并没有指向内存中的同一个确切位置......??

在第二种情况下,我通过以下方式解决了这种(奇怪的?)行为:

obj.ReferenceEquals (i, j)    // false

第一种情况的正确平等测试是什么?

编辑:

我看到调用 obj.ReferenceEquals 在第一种情况下也有效。

有人可以向我解释为什么我必须调用这个函数吗?为什么我不能只使用 = 运算符?

4

2 回答 2

4

( =) 运算符调用GenericEqualityObj。它首先检查 args 的类型(对于数组、可分配性IStructuralEquatable和其他一些特殊情况)和最后的 case 调用obj.EqualsEqualsValueTypeint派生)覆盖以进行位比较。这就解释了为什么(box 123) = (box 123)true.

于 2012-06-22T20:37:03.137 回答
3

Ref 单元格使用records表示,默认情况下,记录在结构上是可比较的\equatable

于 2012-06-22T15:36:15.477 回答