Với F #, tôi hiểu rằng bạn có thể sử dụng từ khóa nội tuyến để thực hiện loại chuyên môn tại trang cuộc gọi. Đó là ::F # inline hoạt động như thế nào?
val inline (+) : ^a -> ^b -> ^c
when (^a or ^b) : (static member (+) : ^a * ^b -> ^c)
ép mà ^a
hoặc ^b
phải có một thành viên tĩnh như op_Addition
, hoặc một trong các xây dựng trong nguyên thủy, có thể được sử dụng để điền vào chỗ trống. Vì vậy, nếu bạn có một phương thức có dấu + và bạn chuyển vào một int và ngắn như các tham số nó unwraps + với một lệnh để sử dụng nguyên thủy được tích hợp cho int, và nếu bạn truyền vào một float và một byte nó sử dụng opcode bổ sung float nguyên thủy.
Làm thế nào chính xác điều này được thực hiện tại thời gian biên dịch? Làm thế nào bạn có thể có một phương pháp trong CLR mà chuyển đổi những gì opcode hoặc phương pháp nó sử dụng dựa trên loại?
Hành vi này có thể xảy ra với Reflection.Emit không? Tôi hiểu rằng nội tuyến được thực hiện tại trang web cuộc gọi, điều đó có nghĩa là mã không hoạt động với C#?
Tôi thực sự không biết nhiều về nội bộ, nhưng có vẻ như mã nguồn F # xác định toán tử '+' (C: \ Program Files (x86) \ FSharp-2.0.0.0 \ source \ fsharp \ FSharp .Core \ prim-types.fs line 3527) chuyển đổi trên các kiểu đối số ở dạng biên dịch và phát ra mã IL trực tiếp. – Juliet