C# F#Riddle:如何调用方法的重载? 第一部分:从F调用F##

C# F#Riddle:如何调用方法的重载? 第一部分:从F调用F##,c#,interop,f#,methods,call,C#,Interop,F#,Methods,Call,假设我们在F#中定义了以下类型: 类型MyClass= 静态成员重载1(x,y)=“Pim” 静态成员重载1(x:System.Tuple)=“Pam” 静态成员重载1 x=“Pum” 您现在在另一个模块(另一个文件)中 如何调用上述三种方法中的每一种 第二部分:从F调用C# 现在,用C#定义一个类: 公共类MyClass{ 公共静态字符串重载1(ax,by){返回“Pim”;} 公共静态字符串重载1(元组x){返回“Pam”;} 公共静态字符串重载1(ax){返回“Pum”;} } 从F#

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

类型MyClass=
静态成员重载1(x,y)=“Pim”
静态成员重载1(x:System.Tuple)=“Pam”
静态成员重载1 x=“Pum”
您现在在另一个模块(另一个文件)中

如何调用上述三种方法中的每一种

第二部分:从F调用C# 现在,用C#定义一个类:

公共类MyClass{
公共静态字符串重载1(ax,by){返回“Pim”;}
公共静态字符串重载1(元组x){返回“Pam”;}
公共静态字符串重载1(ax){返回“Pum”;}
}

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

嗯,我不清楚是否可以调用F#“Pam”方法。但剩下的是

C#:

使用系统;
命名空间CSharp
{
公共类MyClass
{
公共静态字符串重载1(ax,by){返回“Pim”;}
公共静态字符串重载1(元组x){返回“Pam”;}
公共静态字符串重载1(ax){返回“Pum”;}
}
}
F#:

名称空间FSharp
类型MyClass=
静态成员重载1(x,y)=“Pim”
静态成员重载1(x:System.Tuple)=“Pam”
静态成员重载1 x=“Pum”
名称空间DoIt
模块示例=
让CallFSharp()=
printfn“%s”以下是对F部分的回答:

MyClass.1(1,2)
MyClass.Overload1(unbox(1,2)):System.Tuple)
MyClass.1 1

噢,谢谢你的编辑,布莱恩。我想我开始太习惯打字了!这里有趣的是,F#和C#编译器都将为“Pam”方法生成相同的方法签名,但是您需要使用不同的(和黑客的)语法来调用它们!
type MyClass =
    static member Overload1 (x, y) = "Pim"
    static member Overload1 (x : System.Tuple<_, _>) = "Pam"
    static member Overload1 x = "Pum"
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"; }
}
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"; }
    }
}
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()        
MyClass.Overload1(1,2)
MyClass.Overload1<_,_>(unbox (box (1,2)) : System.Tuple<int,int>)
MyClass.Overload1 1