如果我有一个隐式转换为 double 的 C# 类,如下所示:
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'
有什么方法可以做到这一点(我猜没有,基于 this question/answer ),如果没有,什么是合适的解决方法?
最佳答案
F# 不执行隐式转换,但它允许您定义显式运算符来运行它们。查看kvb's answer to a previous question :
let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x)
这是使用 statically resolved type parameters也就是说,输入或结果需要提供隐式转换运算符 - 这些被编译为名为 op_Implicit
的方法,因此 F# 编译器检查具有此特殊名称的静态方法。
使用 !>
运算符,您现在可以在您的代码中明确说明要将 Parameter
转换为 float
的位置(两次)代码示例如下:
let a = Parameter(4.0)
let b = Parameter(2.0)
let c = !> a * Math.Sin(!> b)
我认为不允许在 F# 中进行隐式转换的主要原因是它会使类型推断更加困难,并且编译器很难给出正确的错误消息。
关于c# - 无论如何都可以使用 F# 中的 C# 隐式运算符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10719770/