为什么F#不为运营商提供自定义重载==?

时间:2010-09-23 11:44:11

标签: .net f# operator-overloading equals

F#中的歧视联合和其他原始类型默认使用结构相等,并为.Equals方法提供生成的覆盖。 F#等号运算符明显不同于C#,因为它甚至对于引用类型使用.Equals方法,但是当使用来自C#的F#区分联合时,使用默认运算符== for object,它检查引用相等而不是结构平等。

为什么F#不为有区别的联合类型生成自定义运算符==,以便==在其他.NET语言中使用时给出预期的行为?

2 个答案:

答案 0 :(得分:1)

此类行为是由您使用的语言定义的,而不是您所使用类型的原始语言定义的。

答案 1 :(得分:0)

我不是F#团队,所以我只能推测,但这里有一些潜在的原因:

  1. 如果要在C#中使用结构相等,则可以使用Equals方法。 C#提供了测试两种不同类型的相等性的方法 - 为什么F#强制它们在可能更喜欢能够使用引用相等性时以相同的方式运行?
  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有明显的好处,也可能会因为优先级较高的功能而被删除。