2010-09-23 31 views
6

Các công đoàn bị phân biệt đối xử và các kiểu nguyên thủy khác trong F # sử dụng công bằng cấu trúc theo mặc định và cung cấp ghi đè được tạo cho phương thức .Equals. Toán tử equality F # dường như khác với phương thức C# ở chỗ nó sử dụng phương thức .Equals cho các kiểu tham chiếu, nhưng khi các công thức phân biệt F # được sử dụng từ C#, toán tử mặc định == cho đối tượng được sử dụng. sự bình đẳng về cấu trúc.Tại sao F # không cung cấp quá tải tùy chỉnh cho toán tử ==?

Tại sao F # không tạo toán tử tùy chỉnh == cho các loại liên kết bị phân biệt sao cho == đưa ra hành vi mong đợi khi được sử dụng trong các ngôn ngữ .NET khác?

Trả lời

1

Hành vi như vậy được xác định bằng ngôn ngữ bạn đang sử dụng và không phải bằng ngôn ngữ gốc của loại bạn đang sử dụng.

+0

Nhưng chắc chắn, toán tử == phải được xem là khái niệm .NET chứ không phải khái niệm C#, và F # cần chơi tốt với phần còn lại của ... – SoftMemes

+0

Toán tử '==' là C# điều. Họ sử dụng các tên khác nhau ('=' vs '==') chính xác bởi vì chúng làm những thứ khác nhau, và nó được thừa hưởng từ OCaml đã làm điều đó. –

+0

@Jon - trong khi đó là sự thật, nhóm F # đảm bảo rằng toán tử số học phổ biến hoạt động trên các ngôn ngữ (ví dụ: '(+)' được dịch sang 'op_Addition', đó là những gì C# nhận ra). Họ có thể đã tạo ra một phương thức 'op_Equality' dễ dàng. – kvb

0

Tôi không trên # đội F, vì vậy tôi chỉ có thể suy đoán, nhưng đây là một vài lý do tiềm năng:

  1. Nếu bạn muốn sử dụng bình đẳng cấu trúc từ bên trong C#, bạn chỉ có thể sử dụng Equals phương pháp. C# cung cấp các cách để kiểm tra hai loại bình đẳng riêng biệt - tại sao F # buộc chúng hoạt động theo cách tương tự khi có thể muốn sử dụng bình đẳng tham chiếu?
  2. Nếu bạn muốn để buộc C# để sử dụng bình đẳng về cơ cấu, thật dễ dàng để làm điều đó cho mình:

    type T = A | B of int with 
        static member op_Equality(t:T,t2:T) = t = t2 
        // or even static member (=)(t:T, t2:T) = t = t2 
    
  3. Có một chi phí phát triển đối với bất kỳ tính năng, vì vậy ngay cả khi đã có một lợi ích rõ ràng để tự động tạo ra một op_Equality, nó có thể đã bị loại bỏ vì ưu tiên các tính năng ưu tiên cao hơn.

+0

1. Có, nhưng == không phải luôn luôn tham chiếu bình đẳng, object.ReferenceEquals là. C# không sử dụng giá trị bình đẳng cho ==, nơi nó có ý nghĩa, chẳng hạn như đối với các chuỗi (là một kiểu tham chiếu nhưng thực hiện so sánh giá trị khi sử dụng ==). – SoftMemes

+0

Điều thú vị là, theo Reflector, 'Object.ReferenceEquals' đơn giản gọi' == '. –

+0

@ Joel - đó là tốt, vì các đối số được gõ tĩnh là đối tượng, có nghĩa là các toán tử chấp nhận == sẽ luôn được sử dụng, ngay cả khi kiểu thời gian chạy là một cái gì đó hoàn toàn khác. – SoftMemes

Các vấn đề liên quan