【问题标题】:Default method with tupled parameters for an F# classF# 类的具有元组参数的默认方法
【发布时间】:2011-04-29 15:32:13
【问题描述】:

为什么这个 F# 类不能编译(VS2010):

type Base =
    abstract func : (int * int) -> int

    default this.func (x : int, y : int) : int =
        x + y

func 的默认实现导致了这个编译错误:

Error   9   This override takes a different number of arguments to the corresponding abstract member

如果我改变它成为会员:

type Base =
    abstract func : (int * int) -> int

    member this.func (x : int, y : int) : int =
        x + y

然后编译(虽然我现在相信抽象函数缺少实现),第二个函数的类型与第一个匹配。

在相关说明中,为什么编译器不要求 Base 的第二个定义具有 AbstractClass 属性?

【问题讨论】:

  • 您在问:“为什么编译器要求第二个定义具有 AbstractClass 属性?” - 当我对此进行测试时,编译器 确实 需要该属性。你用的是什么版本的编译器?
  • @wmeyer:你是对的。因为我测试上述代码的文件有一个错误,intellisense 没有将缺少 AbstractClass 属性作为错误突出显示。

标签: class f# methods abstract


【解决方案1】:

去掉括号:

type Base =
    abstract func : int * int -> int

    default this.func (x : int, y : int) : int =
        x + y

你甚至可以缩短一点:

default this.func(x, y) = x + y

【讨论】:

    【解决方案2】:

    要编译第一个版本,您需要编写:

    type Base1 =
        abstract func : (int * int) -> int
        default this.func( (x : int, y : int) ) : int =
            x + y
    

    我没有规范的链接,但 F# 通常不会将成员编译为将元组作为参数的方法。它通常使用具有多个参数的 .NET/C# 友好方法。 abstract 成员强制执行此表示,因此 default 成员需要使用更明确的语法执行相同操作。

    您对第二种类型的理解是正确的 - 第二个声明是一个具有未实现抽象方法的抽象类(以及另一个恰好具有相同名称的方法)。为此,F# 需要 AbstractClass 属性(上面不需要它,因为它不是抽象的)。

    【讨论】:

    • 谢谢。尽管您的答案在技术上是正确的(并且信息量更大),但我选择了 Daniel 的答案,因为他发现我不需要括号)。在 F#、C# 和 C++ 之间切换时,我往往会感到困惑。
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2016-03-22
    • 2014-08-11
    • 1970-01-01
    相关资源
    最近更新 更多