代码之家  ›  专栏  ›  技术社区  ›  SoftMemes

为什么F#不为operator==提供自定义重载?

  •  7
  • SoftMemes  · 技术社区  · 14 年前

    F#中的判别联合和其他基元类型默认使用结构相等,并为.Equals方法提供生成的重写。F#equality运算符与C#运算符的明显不同之处在于,它甚至对引用类型使用.Equals方法,但当F#Decriminated Union与C#一起使用时,将使用默认运算符==for object,这将检查引用相等性而不是结构相等性。

    2 回复  |  直到 14 年前
        1
  •  1
  •   J D    14 年前

    这种行为是由你正在使用的语言定义的,而不是由你正在使用的类型的源语言定义的。

        2
  •  1
  •   kvb    14 年前

    1. 如果您想在C#中使用结构相等,您可以使用 Equals 方法。C#提供了测试两种不同类型相等性的方法—为什么F#应该强制它们以相同的方式进行操作,而a可能更愿意使用引用相等性?
    2. 如果你想强迫C#使用结构等式,你自己很容易做到:

      type T = A | B of int with
        static member op_Equality(t:T,t2:T) = t = t2
        // or even static member (=)(t:T, t2:T) = t = t2
      
    3. 任何特性都有开发成本,所以即使自动生成 op_Equality