我有e : Expr
和一个遍历并改变表达式的函数,我们将其命名为transform
。
我在transform
中应用e
两次并获得e1
和e2
。
令我惊讶的是:e1 <> e2
。
对于更简单的表达式,等式成立!
如何调试这个,是否有一般功能,实用程序来帮助检测不同结构的部分?
有趣:比较两个表达式的字符串输出printfn "%A"
=&gt;平等。
答案 0 :(得分:1)
这是Var
当前覆盖其Equals和GetHashCode方法的方式。可用来源here。
override v.GetHashCode() = base.GetHashCode()
override v.Equals(obj:obj) =
match obj with
| :? Var as v2 -> System.Object.ReferenceEquals(v,v2)
| _ -> false
interface System.IComparable with
member v.CompareTo(obj:obj) =
match obj with
| :? Var as v2 ->
if System.Object.ReferenceEquals(v,v2) then 0 else
let c = compare v.Name v2.Name
if c <> 0 then c else
#if FX_NO_REFLECTION_METADATA_TOKENS // not available on Compact Framework
#else
let c = compare v.Type.MetadataToken v2.Type.MetadataToken
if c <> 0 then c else
let c = compare v.Type.Module.MetadataToken v2.Type.Module.MetadataToken
if c <> 0 then c else
#endif
let c = compare v.Type.Assembly.FullName v2.Type.Assembly.FullName
if c <> 0 then c else
compare v.Stamp v2.Stamp
| _ -> 0
这意味着,您必须实现与Equals()
上使用Var
方法的方法不同的方式,因为只有两个Var
s相等且它们的引用相等。