为什么 F# 不为运算符 == 提供自定义重载?
F# 中的可区分联合和其他基元类型默认使用结构相等,并为 .Equals 方法提供生成的重写。 F# 相等运算符显然与 C# 相等运算符不同,因为即使对于引用类型,它也使用 .Equals 方法,但是当从 C# 使用 F# 可区分联合时,将使用对象的默认运算符 == ,该运算符检查引用相等性而不是检查引用相等性结构平等。
为什么 F# 不为可区分的联合类型生成自定义运算符 == ,以便 == 在其他 .NET 语言中使用时给出预期的行为?
Discriminated unions and other primitive types in F# uses structural equality by default, and provides a generated override for the .Equals method. The F# equality operator apparently differs from the C# one in that it uses the .Equals method even for reference types, but when F# discriminated unions are used from C#, the default operator== for object is used, which checks for reference equality rather than structural equality.
Why does not F# generate a custom operator== for discriminated union types so that == gives the expected behaviour when used in other .NET languages?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
此类行为是由您正在使用的语言定义的,而不是由您正在使用的类型的原始语言定义的。
Such behaviour is defined by the language you are using and not by the language of origin of the type you are using.
我不是 F# 团队的成员,所以我只能推测,但这里有一些潜在的原因:
Equals
方法即可。 C# 提供了测试两种不同类型的相等性的方法 - 当 a 可能更喜欢使用引用相等性时,为什么 F# 应该强制它们以相同的方式运行?如果您想强制 C# 使用结构相等,您自己很容易做到:
<前><代码>类型 T = A | int 的 B 与
静态成员 op_Equality(t:T,t2:T) = t = t2
// 甚至静态成员 (=)(t:T, t2:T) = t = t2
任何功能都有开发成本,因此即使自动生成 < 结构有明显的好处, code>op_Equality,它可能已被放弃,以支持更高优先级的功能。
I'm not on the F# team, so I can only speculate, but here are a few potential reasons:
Equals
method. C# provides ways to test for two distinct kinds of equality - why should F# force them to behave in the same way when a might prefer to be able to use reference equality?If you want to force C# to use structural equality, it's easy to do it yourself:
There's a development cost to any feature, so even if there were a clear benefit to automatically generating an
op_Equality
, it might have been dropped in favor of higher priority features.