2010-11-12 32 views
8

Có thể cung cấp việc triển khai cho toán tử equality = == trong F # không?Thực hiện toán tử đẳng thức C# từ F #

EDIT:

Mã này:

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

Tạo cảnh báo trình biên dịch:

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.

Phần thứ hai đề cập đến những gì tôi đã cố gắng làm. Bất kỳ ý tưởng nào tại sao op_Equality được ưu tiên hơn chỉ đơn giản là (=)?

+0

Bạn có muốn hàm F # hoạt động giống như toán tử equality C# không? Tức là, sử dụng 'toán tử ==' nếu có, và gọi 'object.Equals' nếu không? –

+0

Tôi đã muốn một nhà điều hành bình đẳng sẽ được gọi khi '==' được sử dụng từ C#. – Daniel

Trả lời

8

đặn nó ra:

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

Bạn đang tìm kiếm operator overloading in F#?

Các toán tử khác nhau được định nghĩa trong CIL, do đó quá tải tải toán tử trong F # sẽ làm quá tải nó trong C#, VB.NET và bất kỳ ngôn ngữ .NET nào khác hỗ trợ toán tử đó.

+0

Tôi đã bị ấn tượng sai rằng quá tải '=' trong F # tạo ra IL khác hơn là quá tải '==' trong C#. Nó vẫn là một IMO kì quặc. Tôi đã cập nhật câu hỏi với các chi tiết. – Daniel

2

Có lẽ, op_Equality được ưa chuộng trên (=) kể từ cái nhìn thứ hai, nếu như nó nên ảnh hưởng đến các nhà điều hành bình đẳng trong F #. Tức là, hành vi của mã sau có thể gây nhầm lẫn:

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

let eq = (=) (T()) (T()) // false??? 
Các vấn đề liên quan