是否有相当于在F#中创建C#隐式运算符?

时间:2009-11-06 11:03:41

标签: c# f#

在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#中执行此操作?

5 个答案:

答案 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