【问题标题】:F# Riddle: how to call an overload of a method?F#谜语:如何调用方法的重载?
【发布时间】:2011-01-03 08:59:12
【问题描述】:

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

【问题讨论】:

  • 哦,谢谢你的编辑,布莱恩。我想我开始太习惯于输入推理了!
  • 这里有趣的是,F# 和 C# 编译器都会为“Pam”方法生成相同的方法签名,但是您需要使用不同的(和骇人听闻的)语法来调用它们!跨度>

标签: c# interop f# methods call


【解决方案1】:

嗯,我不清楚是否可以调用 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&lt;...&gt; 对象作为参数的方法。

【讨论】:

    【解决方案2】:

    这是 F# 部分的答案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2011-05-06
      • 2016-05-28
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多