无论如何使用F#的C#隐式运算符?

如果我有一个C#类隐式转换为double,就像这样:

public class Parameter { private double _value; public Parameter(double value) { _value = value } public static implicit operator double(Parameter p) { return _value; } } 

F#不喜欢我试图使用它,就好像它是一个float

 let a = Parameter(4.0) let b = Parameter(2.0) let c = a * Math.Sin(b) <-- 'expected float, here Parameter' 

有没有办法做到这一点(我猜测没有,基于这个问题/答案 ),如果没有,什么是一个体面的解决方法?

F#不执行隐式转换,但它允许您定义一个显式运算符来运行它们。 请参阅kvb对上一个问题的回答 :

 let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x) 

这是使用静态解析的类型参数来表示输入或结果需要提供隐式转换运算符 – 这些运算符被编译为名为op_Implicit方法,因此F#编译器检查具有此特殊名称的静态方法。

使用!>运算符,您现在可以在代码示例中明确说明要将Parameter转换为float (两次),如下所示:

 let a = Parameter(4.0) let b = Parameter(2.0) let c = !> a * Math.Sin(!> b) 

我认为不允许在F#中进行隐式转换的主要原因是它会使类型推断变得更加困难,并且编译器很难给出好的错误消息。

它不会让你进行隐式转换。 在需要的地方明确转换。

请参阅此处了解明确的各种方法: http : //natehoellein.blogspot.com/2008/02/basic-type-conversions-with-f.html

FSharp.Interop.Dynamic使用DLR,因此对于大多数人来说可能是矫枉过正,但是有一个函数Dyn.implicitConvert用于动态使用C#隐式运算符。

  [] member basic.``Test Implicit Conversion`` ()= let ele = 50 ele |> Dyn.implicitConvert |> should equal (decimal 50)