Vấn đề của tôi, trong Tóm lại, là thế này:F # so vs C# IComparable
Tôi có thể làm gì về việc lưu trữ một tuple (hoặc bất kỳ loại với một hạn chế của 'so') trong một # chứa C đòi hỏi phải có một IComparable?
này hoạt động:
> let x (y : 'a when 'a : comparison) = y ;;
val x : y:'a -> 'a when 'a : comparison
> x (1,2) ;;
val it : int * int = (1, 2)
Tôi đã có thể nghĩ điều này sẽ làm việc:
> let x (y : IComparable<int>) = y ;;
val x : y:IComparable<int> -> IComparable<int>
> x (1,2) ;;
x (1,2) ;;
---^^^
stdin(28,4): error FS0001: The type ''a * 'b' is not compatible with the type 'IComparable<int>'
Và đây cũng như:
> let x (y : IComparable) = y ;;
val x : y:IComparable -> IComparable
> x (1,2) ;;
x (1,2) ;;
---^^^
stdin(30,4): error FS0001: The type ''a * 'b' is not compatible with the type 'IComparable'
EDIT
Tôi thực hiện theo các đối số rằng F # không thực hiện upcasting ngầm. Tuy nhiên, ngay cả một cách rõ ràng:
> (1, 2) :> IComparable ;;
(1, 2) :> IComparable ;;
^^^^^^^^^^^^^^^^^^^^^
stdin(43,1): error FS0193: Type constraint mismatch. The type
int * int
is not compatible with type
IComparable
The type 'int * int' is not compatible with the type 'IComparable'
Tôi cho rằng điều này làm cho cảm giác như là so sánh của một F # tuple được suy ra cấu trúc bên trong F # hệ thống loại, và có lẽ là thông tin thêm là không có sẵn cho .NET.
Có vẻ như một cách giải quyết mỗi một bình luận dưới đây là cách gọi
Tuple<_,_> (1,2) ;;
Hoặc thậm chí
box (1, 2) :?> IComparable ;;
Nó có vẻ kỳ lạ, 'int * int' cụ,' IComparable' (bạn có thể kiểm tra điều này với '(1,2) .GetType() GetInterfaces() '), nhưng trình biên dịch sẽ không cho phép bạn bỏ chạy. Điều này có thể là một số loại hạn chế F # lạ. Tôi tưởng tượng rằng bạn có thể viết một phương thức C# để thực hiện kiểu truyền. –
Tôi đã cập nhật phản hồi của mình để chính xác hơn. Xin lỗi vì những lỗi lầm. –