2009-11-06 14 views
24

W języku C# można dodać operatorów ukryte do klasy jak następuje:Czy istnieje odpowiednik utworzenia niejawnego operatora C# w 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(); 
    } 
} 

Wtedy będę mógł przekazać dowolną funkcję, która spodziewa się MojaKlasa obiekt ciąg lub int. np

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

Czy istnieje sposób to zrobić w F #?

Odpowiedz

27

Jak zauważyli inni, nie ma sposobu na niejawną konwersję w F #. Jednak zawsze można tworzyć własne operatora, aby to nieco łatwiejsze jawnie przekonwertować rzeczy (i ponownego użycia żadnych definicji op_Implicit że istniejące zajęcia zostały zdefiniowane):

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

Wtedy można go używać tak:

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

Wygląda na to, że jest to niepoprawna nazwa operatora prefiksu w języku F # 2.0. Czy reguły nazw operatorów są gdzieś zdefiniowane? Nic nie widzę na stronie [MSDN] (http://msdn.microsoft.com/en-us/library/dd233204.aspx), która wskazuje to ograniczenie. – Daniel

+0

Pominięcie '~' z nazwy wydaje się działać. Czy zasady się zmieniły? – Daniel

+0

@Daniel - tak, myślę, że zasady musiały się zmienić. Pominięcie '~' nie zadziała, ponieważ spowoduje, że będzie to raczej infiks niż operator prefiksu. Jednak zastąpienie '~' '!' Powinno działać. – kvb

8

Implicyjna konwersja jest dość problematyczna w odniesieniu do bezpieczeństwa typu i typu wnioskowania, więc odpowiedź brzmi: Nie, w rzeczywistości byłaby to problematyczna funkcja.

Powiązane problemy