为什么这个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属性?
答案 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
属性(上面不需要它,因为它不是抽象的)。