Подтвердить что ты не робот

Существует ли эквивалент создания неявного оператора С# в 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();
    }
}

Затем я могу передать любую функцию, ожидающую, что объект 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 #?

4b9b3361

Ответ 1

Как указывали другие, нет способа сделать неявное преобразование в 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())

Ответ 2

Неявное преобразование является довольно проблематичным в отношении безопасности типа и вывода типа, поэтому ответ таков: Нет, это действительно было бы проблематичной функцией.

Ответ 3

Нет, нет.

Ответ 4

В связанной заметке можно добавить неявные или явные статические члены, чтобы С# мог их использовать.

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

Это позволяет пользователю aС# использовать (int) Wales например

Ответ 5

Вы можете позвонить оператору так:

let casted = TargetClass.op_Implicit sourceObject