代码之家  ›  专栏  ›  技术社区  ›  Bruno Reis

F谜语:如何调用方法的重载?

  •  4
  • Bruno Reis  · 技术社区  · 15 年前

    第一部分:从F呼叫F #

    假设我们在f中定义了以下类型:

    type MyClass =
        static member Overload1 (x, y) = "Pim"
        static member Overload1 (x : System.Tuple<_, _>) = "Pam"
        static member Overload1 x = "Pum"
    

    您现在在另一个模块中(在另一个文件中)。

    如何调用上面显示的三个方法中的每一个?

    第二部分:从F呼叫C #

    现在,在C中定义一个类:

    public class MyClass {
        public static string Overload1<a, b>(a x, b y) { return "Pim"; }
        public static string Overload1<a, b>(Tuple<a, b> x) { return "Pam"; }
        public static string Overload1<a>(a x) { return "Pum"; }
    }
    

    从F代码中,如何调用C中定义的三个方法中的每一个?

    2 回复  |  直到 15 年前
        1
  •  4
  •   kvb    15 年前

    下面是F部分的答案:

    MyClass.Overload1(1,2)
    MyClass.Overload1<_,_>(unbox (box (1,2)) : System.Tuple<int,int>)
    MyClass.Overload1 1
    
        2
  •  5
  •   Brian    15 年前

    嗯,我不清楚是否可以调用f“pam”方法。但剩下的就在这里。

    C:

    using System;
    namespace CSharp
    {
        public class MyClass
        {
            public static string Overload1<a, b>(a x, b y) { return "Pim"; }
            public static string Overload1<a, b>(Tuple<a, b> x) { return "Pam"; }
            public static string Overload1<a>(a x) { return "Pum"; }
        }
    }
    

    F:

    namespace FSharp
    
    type MyClass =
        static member Overload1 (x, y) = "Pim"
        static member Overload1 (x : System.Tuple<_, _>) = "Pam"
        static member Overload1 x = "Pum"
    
    namespace DoIt
    
    module Examples =
        let CallFSharp() =
            printfn "%s" <| FSharp.MyClass.Overload1(1,2)   // Pim
            printfn "%s" <| FSharp.MyClass.Overload1((1,2)) // Pum!
            printfn "%s" <| FSharp.MyClass.Overload1(())    // Pum
    
    
        let CallCSharp() =
            printfn "%s" <| CSharp.MyClass.Overload1(1,2)             // Pim
            printfn "%s" <| CSharp.MyClass.Overload1<int,int>((1,2))  // Pam
            printfn "%s" <| CSharp.MyClass.Overload1(())              // Pum
    
        do
            CallFSharp()        
            CallCSharp()        
    

    当然,在实践中,很难看到IL中的方法 System.Tuple<...> 对象作为参数。