具有F#类的tupled参数的默认方法

时间:2011-04-29 15:32:13

标签: class f# methods abstract

为什么这个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属性?

2 个答案:

答案 0 :(得分:5)

摆脱括号:

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

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

你甚至可以缩短它:

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

答案 1 :(得分:4)

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

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

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

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