调试结构平等"问题"

时间:2014-04-12 20:22:23

标签: f# equality

我有e : Expr和一个遍历并改变表达式的函数,我们将其命名为transform。 我在transform中应用e两次并获得e1e2

令我惊讶的是:e1 <> e2

对于更简单的表达式,等式成立!

如何调试这个,是否有一般功能,实用程序来帮助检测不同结构的部分?

有趣:比较两个表达式的字符串输出printfn "%A" =&gt;平等。

1 个答案:

答案 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相等且它们的引用相等。