如何像在 C# 中一样在 F# 中进行显式重载转换?

How to do explicit overloaded conversion in F# like in C#?

假设我在 C# 中有一个 class,带有重载的隐式和显式运算符:

public static implicit operator CSClass(int a) => ...;
public static explicit operator int(CSClass a) => ...;

我将此项目编译为 class 库。

在 F# 中,我现在可以为隐式转换添加我的运算符并使用它:

#r @"C:\path\to.dll"
open Some.Namespace.ToMyClass
let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x)
let a : CSClass = !> 5

但是如何在 F# 中进行显式重载转换? (CSClassint)

据我了解,F# 通常不进行显式转换。相反,您只需使用一个函数。例如,如果您有一个 char 并想将其显式转换为一个 int,您可以在 C# 中编写:

char theChar = 'A';
int convertedChar = (int)theChar;

在 F# 中,int 运算符(函数)用于相同目的:

let theChar = 'A'
let convertedChar = int theChar;

因此,进行转换的惯用方法是这样的:

module Some.Namespace.MyClass
let toInt (x : MyClass) = [...]

您可以这样使用它:

let convertedMyClass = MyClass.toInt myClass

也可以管道:

funcReturningMyClass x y
|> MyClass.toInt
|> printfn "%d"