C# F#Riddle:如何调用方法的重载? 第一部分:从F调用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#
类型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