2009-11-06 12 views
24

En C# que puede agregar operadores implícitos a una clase de la siguiente manera:¿Existe un equivalente para crear un operador implícito de C# en 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(); 
    } 
} 

Entonces puede pasar cualquier función que se espera un objeto MiClase una cadena o un int. por ejemplo

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

¿Hay una manera de hacer esto en C#?

Respuesta

27

Como han señalado otros, no hay forma de realizar conversiones implícitas en F #. Sin embargo, siempre se puede crear su propio operador para que sea un poco más fácil de convertir de forma explícita las cosas (y para reutilizar las definiciones op_Implicit que las clases existentes han definido):

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

A continuación, se puede utilizar de esta manera:

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

Esto parece ser un nombre de operador de prefijo no válido en F # 2.0. ¿Las reglas para los nombres de los operadores están definidas en alguna parte? No veo nada en la página [MSDN] (http://msdn.microsoft.com/en-us/library/dd233204.aspx) que indique esta restricción. – Daniel

+0

Omitir '~' del nombre parece funcionar. ¿Las reglas cambiaron? – Daniel

+0

@Daniel - sí, creo que las reglas deben haber cambiado. Omitir el '~' no funcionará del todo porque lo convertirá en un infijo en lugar de un operador de prefijo. Sin embargo, reemplazar '~' con '!' Debería funcionar. – kvb

8

La conversión implícita es bastante problemática con respecto a la seguridad de tipo y la inferencia de tipo, por lo que la respuesta es: No, en realidad sería una característica problemática.

Cuestiones relacionadas