2009-11-06 2 views
24

En C# je peux ajouter des opérateurs implicites à une classe comme suit:Y at-il un équivalent à la création d'un C# opérateur implicite dans F #?

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(); 
    } 
} 

Ensuite, je peux passer toute fonction qui attend un objet MyClass une chaîne ou un int. par exemple

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"); 
} 

Est-il possible de le faire en F #?

Répondre

27

Comme d'autres l'ont souligné, il n'y a pas moyen de faire la conversion implicite dans F #. Cependant, vous pouvez toujours créer votre propre opérateur pour le rendre un peu plus facile de convertir explicitement les choses (et de réutiliser des définitions de op_Implicit que les classes existantes ont défini):

let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x) 

Ensuite, vous pouvez l'utiliser comme ceci:

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()) 
+0

Cela semble être un nom d'opérateur de préfixe invalide dans F # 2.0. Les règles pour les noms d'opérateurs sont-elles définies quelque part? Je ne vois rien sur le (http://msdn.microsoft.com/en-us/library/dd233204.aspx) [MSDN] page qui indique cette restriction. – Daniel

+0

L'omission '~' du nom semble fonctionner. Les règles ont-elles changé? – Daniel

+0

@Daniel - oui, je pense que les règles doivent avoir changé. Omettre le '~' ne fonctionnera pas tout à fait car cela en fera un infixe plutôt qu'un opérateur de préfixe. Cependant, remplacer '~' par '!' Devrait fonctionner. – kvb

3

Non, il n'y a pas.

8

conversion implicite est plutôt problématique en ce qui concerne la sécurité de type et inférence, donc la réponse est: Non, ce serait en fait une caractéristique problématique.

Questions connexes