在C#中,我可以将隐式运算符添加到类中,如下所示:
public class MyClass
{
private int data;
public static implicit operator MyClass(int i)
{
return new MyClass { data = i };
}
public static implicit operator MyClass(string s)
{
int result;
if (int.TryParse(s, out result))
{
return new MyClass { data = result };
}
else
{
return new MyClass { data = 999 };
}
}
public override string ToString()
{
return data.ToString();
}
}
然后我可以传递任何期望MyClass对象为字符串或int的函数。 例如
public static string Get(MyClass c)
{
return c.ToString();
}
static void Main(string[] args)
{
string s1 = Get(21);
string s2 = Get("hello");
string s3 = Get("23");
}
有没有办法在F#中执行此操作?
答案 0 :(得分:29)
正如其他人所指出的那样,F#中无法进行隐式转换。但是,您总是可以创建自己的运算符,以便更容易显式转换(并重用现有类已定义的任何op_Implicit定义):
let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x)
然后你可以像这样使用它:
type A() = class end
type B() = static member op_Implicit(a:A) = B()
let myfn (b : B) = "result"
(* apply the implicit conversion to an A using our operator, then call the function *)
myfn (!> A())
答案 1 :(得分:8)
关于类型安全和类型推断,隐式转换相当成问题,所以答案是:不,它实际上是一个有问题的特征。
答案 2 :(得分:4)
不,没有。
答案 3 :(得分:0)
在相关说明中,可以添加隐式或显式静态成员,以便C#可以使用它们。
type Country =
| NotSpecified
| England
| Wales
| Scotland
| NorthernIreland
with static member op_Implicit(c:Country) =
match c with | NotSpecified -> 0
| England -> 1
| Wales -> 2
| Scotland -> 3
| NorthernIreland -> 4
这允许c#用户使用(int) Wales
例如
答案 4 :(得分:0)
您可以这样致电运营商:
let casted = TargetClass.op_Implicit sourceObject