para - ¿Hay un equivalente a crear un operador implícito de C#en F#?
grados celsius a fahrenheit c# (3)
En C # puedo agregar operadores implícitos a una clase de la siguiente manera:
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();
}
}
Luego puedo pasar cualquier función que esté esperando que un objeto MyClass sea una cadena o un int. p.ej
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 alguna manera de hacer esto en F #?
Como han señalado otros, no hay manera de hacer una conversión implícita en F #. Sin embargo, siempre puede crear su propio operador para facilitar la conversión explícita de las cosas (y 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)
Entonces puedes usarlo así:
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())
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.
No no hay.