Реализовать оператор равенства C # из F # - PullRequest
8 голосов
/ 12 ноября 2010

Можно ли обеспечить реализацию для оператора равенства C = (==) в F #?

РЕДАКТИРОВАТЬ :

Этот код:

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 ]

8 голосов
/ 12 ноября 2010

Разобрался:

type Foo() =
    static member op_Equality (left : Foo, right : Foo) =
3 голосов
/ 12 ноября 2010

Вы ищете перегрузку операторов в F # ?

Различные операторы определены в CIL, поэтому перегрузка загрузки оператора в F # перегрузит его в C #, VB.NET и любойдругой язык .NET, поддерживающий этот оператор.

2 голосов
/ 13 ноября 2010

Предположительно, op_Equality предпочтительнее, чем (=), поскольку последний выглядит так, как будто он должен влиять на оператор равенства в F #.То есть поведение следующего кода может сбивать с толку:

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

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