从F#实现C#相等运算符

时间:2010-11-12 19:15:12

标签: f# operator-overloading equality

是否可以在F#中为C#相等(==)运算符提供实现?

编辑

此代码:

static member (=) (left : Foo, right : Foo) =

生成编译器警告:

The name '(=)' should not be used as a member name. To define equality semantics for a type, override the 'Object.Equals' member. If defining a static member for use from other CLI languages then use the name 'op_Equality' instead.

后一部分解决了我试图做的事情。知道为什么op_Equality(=)更受青睐?

3 个答案:

答案 0 :(得分:8)

想出来:

type Foo() =
    static member op_Equality (left : Foo, right : Foo) =

答案 1 :(得分:3)

您在寻找operator overloading in F#吗?

在CIL中定义了不同的运算符,因此在F#中加载运算符的重载会使它在C#,VB.NET和支持该运算符的任何其他.NET语言中超载。

答案 2 :(得分:2)

据推测,op_Equality(=)更受青睐,因为后者看起来好像应该影响F#中的相等运算符。也就是说,以下代码的行为可能会令人困惑:

type T() =
  static member (=)(x:T,y:T) = true

let eq = (=) (T()) (T()) // false???