2010-11-12 18 views
8

Czy można podać implementację operatora równości C# (==) w języku F #?Implementacja operatora równości C# z F #

EDIT:

ten kod:

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

Produkuje ostrzeżenie kompilatora:

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.

Dalsza część adresów, co starałem się zrobić. Każdy pomysł, dlaczego op_Equality jest faworyzowany ponad po prostu (=)?

+0

Czy chcesz funkcji F #, która zachowuje się tak samo, jak operator równości C#? To znaczy, używając 'operator ==' tam, gdzie to możliwe, i wywołując 'object.Equals', jeśli nie? –

+0

Chciałam operatora równości, który byłby wywoływany, gdy '==' jest używany z C#. – Daniel

Odpowiedz

8

Zdobione:

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

Szukasz operator overloading in F#?

Różne operatory są zdefiniowane w CIL, więc przeciążenie ładowania operatora w F # spowodowałoby jego przeciążenie w C#, VB.NET i jakimkolwiek innym języku .NET, który obsługuje ten operator.

+0

Byłem pod fałszywym wrażeniem, że przeciążenie '=' w F # daje inną IL niż przeciążenie '==' w C#. To wciąż trochę dziwaczne IMO. Zaktualizowałem pytanie podając szczegóły. – Daniel

2

Przypuszczalnie op_Equality jest faworyzowany przez (=) ponieważ ta ostatnia wygląda tak, jakby to powinno wpłynąć operator równości w F #. Oznacza to, że zachowanie następującego kodu może być mylące:

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

let eq = (=) (T()) (T()) // false??? 
Powiązane problemy