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

发布于 2024-09-24 07:17:24 字数 236 浏览 2 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

零度℉ 2024-10-01 07:17:24

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

Such behaviour is defined by the language you are using and not by the language of origin of the type you are using.

述情 2024-10-01 07:17:24

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

  1. 如果您想在 C# 中使用结构相等,则只需使用 Equals 方法即可。 C# 提供了测试两种不同类型的相等性的方法 - 当 a 可能更喜欢使用引用相等性时,为什么 F# 应该强制它们以相同的方式运行?
  2. 如果您想强制 C# 使用结构相等,您自己很容易做到:

    <前><代码>类型 T = A | int 的 B 与
    静态成员 op_Equality(t:T,t2:T) = t = t2
    // 甚至静态成员 (=)(t:T, t2:T) = t = t2

  3. 任何功能都有开发成本,因此即使自动生成 < 结构有明显的好处, code>op_Equality,它可能已被放弃,以支持更高优先级的功能。

I'm not on the F# team, so I can only speculate, but here are a few potential reasons:

  1. If you want to use structural equality from within C#, you can just use the 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?
  2. If you want to force C# to use structural equality, it's easy to do it yourself:

    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. 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文