2010-11-12 2 views
8

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

EDIT:

Этот код:

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 предпочитают просто (=)?

+0

Вы хотите, чтобы функция F # вела себя так же, как оператор равенства C#? То есть, используя 'operator ==' где доступно и вызывая 'object.Equals', если нет? –

+0

Мне нужен оператор равенства, который будет вызываться, когда '==' используется с C#. – Daniel

ответ

8

Фигурного это:

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

Вы ищете operator overloading in F#?

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

+0

Я был под ложным впечатлением, что перегрузка '=' в F # создает различный IL, чем перегрузка '==' в C#. Это все еще немного изворотливый ИМО. Я обновил вопрос с подробностями. – Daniel

2

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

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

let eq = (=) (T()) (T()) // false??? 
Смежные вопросы