2010-11-12 21 views
8

¿Es posible proporcionar una implementación para el operador C# equality (==) en F #?Implemente el operador de igualdad C# de F #

EDITAR:

este código:

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

Produce la advertencia del compilador:

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.

La última parte se ocupa de lo que estaba tratando de hacer. ¿Alguna idea de por qué op_Equality se ve favorecida simplemente por (=)?

+0

¿Desea una función F # que se comporte de la misma manera que el operador de igualdad C#? Es decir, usando 'operator ==' donde esté disponible, y llamando 'object.Equals' si no? –

+0

Quería un operador de igualdad al que se llamaría cuando '==' se usa desde C#. – Daniel

Respuesta

8

lo descubrió:

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

¿Está buscando operator overloading in F#?

Los diferentes operadores se definen en CIL, por lo que sobrecargar un operador en F # lo sobrecargaría en C#, VB.NET y en cualquier otro lenguaje .NET que admita ese operador.

+0

Tenía la falsa impresión de que la sobrecarga '=' en F # produce IL diferente a la sobrecarga '==' en C#. Todavía es un poco extraño OMI. He actualizado la pregunta con los detalles. – Daniel

2

Presumiblemente, op_Equality se ve favorecida por (=) ya que este último se ve como si debiera afectar el operador de igualdad dentro de F #. Es decir, el comportamiento del siguiente código podría ser confuso:

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

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