2010-08-17 31 views
10

Tôi đang cố gắng để xác định điều hành với các thông số loại rõ ràng và hạn chế điều hành:F #: thông số kiểu tường minh trong ràng buộc

let inline (===)<'a, 'b 
    when 'a : not struct 
    and 'b : not struct> a b = obj.ReferenceEquals (a,b) 

Nó hoạt động tốt trong F # 2.0, nhưng tạo ra:

cảnh báo FS1189:
Thông số loại phải được đặt trực tiếp bên cạnh tên loại, ví dụ "Loại C < 'T>", không phải gõ "C <' T>"

Vì vậy, đúng cách để làm rõ ràng đối số loại đặc điểm kỹ thuật cho định nghĩa điều hành là gì?

p.s. Xin vui lòng không cho tôi biết về các thông số loại tiềm ẩn và một số cách giải quyết khác, tôi muốn giải quyết cụ thể vấn đề này.

Trả lời

12

Lỗi trong trình biên dịch có nghĩa là các toán tử ký hiệu không bao giờ được coi là tiếp giáp trực tiếp với tham số loại. Bạn có thể giải quyết sự cố thông qua ví dụ:

let inline myeq<'a, 'b 
    when 'a : not struct 
    and 'b : not struct> a b = obj.ReferenceEquals (a,b) 

let inline (===) a b = myeq a b 
+1

Ngoài ra mô hình hoạt động có lỗi giống nhau: 'let (| SomePatternName |) <'a, 'b> x = x' – ControlFlow

4
let inline (===) (a : 'TA when 'TA : not struct) (b : 'TB when 'TB : not struct) = 
    obj.ReferenceEquals (a,b) 
+0

tốt, nhưng đây không phải là thông số loại rõ ràng;) – ControlFlow

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