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

4

第一部分:从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#中定义的三个方法?


哦,谢谢你的编辑,Brian。我觉得我已经开始太过依赖类型推断了! - Bruno Reis
有趣的是,F#和C#编译器都会为“Pam”方法生成相同的方法签名,但是你需要使用不同(且hackish)的语法来调用它们! - Bruno Reis
2个回答

5
嗯,我不确定是否可以调用 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()        

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


4

以下是针对 F# 部分的答案:

MyClass.Overload1(1,2)
MyClass.Overload1<_,_>(unbox (box (1,2)) : System.Tuple<int,int>)
MyClass.Overload1 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接