2011-04-29 36 views
2

为什么这个F#类不编译(与VS2010):与用于F#类tupled参数的默认方法

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 

然后编译(虽然我相信现在抽象的func没有实现),第二个func的类型与第一个匹配。

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

+0

你问:“为什么**不**编译器需要第二定义有一个AbstractClass属性?“ - 当我测试这个时,编译器**确实需要这个属性。你使用的是什么版本的编译器? – wmeyer 2011-04-29 16:02:26

+0

@wmeyer:你说得对。由于我测试上述代码的文件有进一步的错误,因此intellisense没有突出显示缺少AbstractClass属性作为错误。 – 2011-04-29 16:13:30

回答

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 
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属性(它不需要用于上述内容,因为它不是抽象的)。

+0

谢谢。虽然你的答案在技术上是正确的(而且更具信息性),但我选择了丹尼尔的答案,因为他发现我不需要括号)。我倾向于在F#,C#和C++之间进行混淆。 – 2011-04-29 16:12:00