F#中的歧视联合和其他原始类型默认使用结构相等,并为.Equals方法提供生成的覆盖。 F#等号运算符明显不同于C#,因为它甚至对于引用类型使用.Equals方法,但是当使用来自C#的F#区分联合时,使用默认运算符== for object,它检查引用相等而不是结构平等。
为什么F#不为有区别的联合类型生成自定义运算符==,以便==在其他.NET语言中使用时给出预期的行为?
答案 0 :(得分:1)
此类行为是由您使用的语言定义的,而不是您所使用类型的原始语言定义的。
答案 1 :(得分:0)
我不是F#团队,所以我只能推测,但这里有一些潜在的原因:
Equals
方法。 C#提供了测试两种不同类型的相等性的方法 - 为什么F#强制它们在可能更喜欢能够使用引用相等性时以相同的方式运行?如果你想强制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
任何功能都会产生开发成本,因此即使自动生成op_Equality
有明显的好处,也可能会因为优先级较高的功能而被删除。