c# - 无论如何都可以使用 F# 中的 C# 隐式运算符吗?

标签 c# f# implicit-conversion

如果我有一个隐式转换为 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/

相关文章:

c# - 将列表<int> 转换为连接的整数字符串?

f# - 使用 VSCode 和 Paket 添加文件到 `.fsproj`

f# - 将大序列作为函数参数传递

c++ - 在不访问其定义的情况下使用头文件中的类?

c - C 中的双指针常量正确性警告

c# - 列出所有 "A"的字符串

c# - Parallel.ForEach 与 Task.Run 和 Task.WhenAll

c# - 如何将结构向量从 Rust 返回到 C#?

f# - 如何总结 seq<type> 上的成员?

c# - 属性未调用的隐式/显式转换运算符 (System.ComponentModel.DataAnnotation.dll)